在返回之前测试属性是否为空

Dav*_*Dev 26 c#

我有以下财产

public MyType MyProperty {get;set;}
Run Code Online (Sandbox Code Playgroud)

我想更改此属性,以便如果值为null,它将首先填充该值,然后返回它...但使用私有成员变量.

例如,如果我这样做:

public MyType MyProperty 
{
    get
    {
        if (_myProperty != null)
            return _myProperty
        else
           _myProperty = XYZ;
            return _myProperty;
    }
    set
    {
        _myProperty = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?或者我需要成员变量才能完成它?

Jon*_*eet 35

您需要一个成员变量和一个完整的属性声明.自动实现的属性在它们是字段周围的平凡包装器时才适用,不涉及逻辑.你可以稍微简化你的getter代码,顺便说一下:

get
{
    if (_myProperty == null)
    {
       _myProperty = XYZ;
    }
    return _myProperty;
}
Run Code Online (Sandbox Code Playgroud)

(请注意,如果没有额外的锁定,这些都不是线程安全的,但我认为没关系.)

顺便说一句,如果你使用自动实现的属性,你已经有了一个私有成员变量 - 只是编译器为你生成它.

  • 有趣的是,在发布问题几周后,我在深度中阅读了C#中自动属性的解释:-)感谢Jon,保持良好的工作! (2认同)

mal*_*lay 12

return _myProperty?? (_myProperty = XYZ);
Run Code Online (Sandbox Code Playgroud)


Kla*_*sen 10

你能做的最好的事情是在构造函数中给它一个值.我知道这样你就失去了"延迟加载",但你不能同时拥有自动属性和延迟加载.

  • 即使它在构造函数中给出了一个值,它也可以(当前)在其他地方设置为null.**可能*更适合确保在构造函数中设置值,但这实际上是关于属性的语义而不是用于实现它的代码. (4认同)