C# 是否已初始化字段,并更改了ctor参数?

C# 是否已初始化字段,并更改了ctor参数?,c#,.net,.net-4.0,lazy-initialization,C#,.net,.net 4.0,Lazy Initialization,这是惰性初始化字段的语法 public class MyClass { string _cat; public MyClass(string Category) { _cat=Category; } MyExpensive _expensive; public MyExpensive Expensive { get { LazyInitializer.EnsureI

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

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;
        }
    }
}
但是,如果我需要使用运行时参数创建新的MyExpensive,该怎么办?(根据流程逻辑)

我不想创建一个标志字段,然后在中执行大量的
IF's

我的意思是,有时候我需要运行
newmyexpensive(“图片”)
,有时候
newmyexpensive(“鲜花”)

我该怎么做

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

如果您要做任何昂贵的事情,您应该使用方法,而不是属性

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

在您的情况下,不要使用getter-use:

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

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

如何获取字符串值?如果这也是来自调用者,那么如果在第二次调用中得到不同的值,您会期望什么?@JonSkeet只有一个字符串值param(在我的情况下)实际上无法回答我的任何问题,尽管…@JonSkeet我已经编辑了代码。然而,我现在明白了,这是一个愚蠢的问题。因为我可以只做
newmyexpensive(\u cat)
.Oded这里的ctor参数在哪里?@RoyiNamir-您可以有一个重载,它接受一个字符串参数并将其传递给
ctor
。请注意上面编辑的代码。这是一个非常愚蠢的问题,因为我本可以这样做,只需使用
newmyexpensive(\u cat)