C# 中是否有一种简洁的方法(基于逻辑)分配一个引用或另一个引用

本文关键字:引用 分配 于逻辑 另一个 一个 简洁 是否 一种 方法 | 更新日期: 2023-09-27 18:34:56

[对不起,这个笨拙的标题 - 我无法找到表达我想做的事情的最佳方式。

我觉得有点傻 - 我刚刚在我的以下代码中发现了一个错误:

private static XmlSchemaSet internalSchema = null;
private static XmlSchemaSet externalSchema = null;
private static XmlSchemaSet GetSchema(SchemaType schemaType)
{
    // Lazy evaluation of schema objects - only create internal
    // and external schema once
    XmlSchemaSet schema =
        schemaType == SchemaType.Internal ? internalSchema : externalSchema;
    if (schema == null)
    {
        schema = new XmlSchemaSet();
        schema.Add("", CreateXmlSchemaFile(schemaType));
    }
    return schema;
}

代码的目的是在首次请求静态成员时仅分配一次静态成员internalSchemaexternalSchema

当然,我尝试的简洁代码有一个明显的错误 - schema本地引用指向internalSchemaexternalSchema指向的对象(最初null(,但是一旦我调用new,它只会重新分配本地引用,而不是静态成员。

有没有一种简单的方法可以实现我想要做的事情? 我想我可以创建另一种通过 ref 关键字获取XmlSchemaSet的方法,但为此创建另一种方法似乎很愚蠢。

C# 中是否有一种简洁的方法(基于逻辑)分配一个引用或另一个引用

懒惰类是你正在寻找的。

大致用法:

private static Lazy<XmlSchemaSet> internalSchema = new Lazy<XmlSchemaSet>(
  () => {
   schema = new XmlSchemaSet();
   schema.Add("", CreateXmlSchemaFile(SchemaType.Internal));
   return schema;
  });

不,没有简单的方法可以按照您要求的方式将"对引用类型的引用"分配给局部变量;对方法使用 ref 参数是实现它的唯一直接方法。

如果您使用的是 .NET 4.0,则可以使用 Lazy<> 类以您想要的方式执行延迟初始化,这 (IMO( 可以通过从常见访问代码中删除一次性初始化代码来使您的代码更易于阅读,例如:

private static Lazy<XmlSchemaSet> internalSchema = new Lazy<XmlSchemaSet>(() => CreateSchema(SchemaType.Internal));
private static Lazy<XmlSchemaSet> externalSchema = new Lazy<XmlSchemaSet>(() => CreateSchema(SchemaType.External));
private static XmlSchemaSet CreateSchema(SchemaType schemaType)
{
    var schema = new XmlSchemaSet();
    schema.Add("", CreateXmlSchemaFile(schemaType));
    return schema;
}
private static XmlSchemaSet GetSchema(SchemaType schemaType)
{
    return schemaType == SchemaType.Internal 
      ? internalSchema.Value 
      : externalSchema.Value;
}

否则,我建议你不要太花哨,而只是编写你的代码来做你想做的事。"正确"代码在 100% 的情况下胜过"简洁"代码:

if (schemaType == SchemaType.Internal)
{ 
    if (internalSchema == null)
    {
        internalSchema = new XmlSchemaSet();
        internalSchema.Add("", CreateXmlSchemaFile(schemaType));
    }
    return internalSchema;
}
else
{
    if (externalSchema == null)
    {
        externalSchema = new XmlSchemaSet();
        externalSchema.Add("", CreateXmlSchemaFile(schemaType));
    }
    return externalSchema;
}