【问题标题】:Lazy initialized field with changed ctor param?具有更改的ctor参数的延迟初始化字段?
【发布时间】:2013-01-07 18:23:51
【问题描述】:

这是惰性初始化字段的语法。

public class MyClass
{
    string _cat;
    public MyClass(string Category)
    {
        _cat=Category;
    }

    MyExpensive _expensive;
    public MyExpensive Expensive
    {
        get 
        {
            LazyInitializer.EnsureInitialized(ref _expensive, () = > new MyExpensive ());
            return _expensive;
        }
    }
}

但是如果我需要使用 run-time ctor params 创建 new MyExpensive 怎么办? (根据流程逻辑)

我不想创建一个标志字段,然后做很多IF's

我的意思是,有时我需要运行new MyExpensive ("picture"),有时需要运行new MyExpensive ("flowers")

我该怎么做?

(不包括为每个类别创建一个惰性字段 - )

【问题讨论】:

  • 你是如何得到字符串值的?如果这也是来自调用者,如果您在第二次调用中得到不同的值,您会期望什么?
  • @JonSkeet 将只有一个字符串值参数(在我的情况下)
  • 虽然这实际上并没有回答我的任何一个问题......
  • @JonSkeet 我已经编辑了代码。但是我现在可以看到这是一个愚蠢的问题。因为我可以做new MyExpensive (_cat)。

标签: c# .net .net-4.0 lazy-initialization


【解决方案1】:

如果你正在做任何事情昂贵,你应该在方法中做,而不是在属性中。

属性应该快速并且便宜,因为这是大多数程序员的正常期望(最小惊讶原则)。

在你的情况下,没有吸气剂 - 使用:

public MyExpensive GetExpensive()
{
    LazyInitializer.EnsureInitialized(ref _expensive, () = > new MyExpensive ());
    return _expensive;
}

当然,你有参数化的重载。

【讨论】:

  • Oded 这里的 ctor 参数在哪里?
  • @RoyiNamir - 你可以有一个重载,它接受一个字符串参数并将它传递给ctor。
  • 请注意上面的编辑代码。这是一个非常愚蠢的问题,因为我本可以这样做,然后用 new MyExpensive (_cat) 执行 ctor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多