1

[对不起这个笨拙的标题——我想不出最好的方式来表达我想做的事情。]

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

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;
}

代码的目的是分配静态成员internalSchema,并且externalSchema仅在首次请求它们时分配一次。

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

有没有一种简单的方法可以实现我想要做的事情?我想我可以创建另一个使用XmlSchemaSetviaref关键字的方法,但是为此创建另一个方法似乎很愚蠢。

4

2 回答 2

4

懒惰的课程是您正在寻找的。

大概用法:

private static Lazy<XmlSchemaSet> internalSchema = new Lazy<XmlSchemaSet>(
  () => {
   schema = new XmlSchemaSet();
   schema.Add("", CreateXmlSchemaFile(SchemaType.Internal));
   return schema;
  });
于 2012-05-23T02:01:07.727 回答
2

不,没有简单的方法可以按照您要求的方式将“对引用类型的引用”分配给局部变量;对方法使用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;
}
于 2012-05-23T02:06:09.347 回答