ReSharper想要"优化"我的守则

时间:2015-09-15 21:33:04

标签: c# .net resharper

以下是......

    SomeType _someProperty;
    public SomeType SomeProperty
    {
        get
        {
            if (_someProperty == null)
                _someProperty = new SomeType();
            return _someProperty;
        }
    }

...具有与以下相同的功能?

    SomeType _someProperty;
    public SomeType SomeProperty
    {
        get { return _someProperty ?? (_someProperty = new SomeType()); }
    }

根据ReSharper他们的确如此。如果是这样,有人可以解释第二个块的语法吗?

4 个答案:

答案 0 :(得分:9)

是的,它们功能相同。

??null coalescing operator。如果不为null,则运算符返回运算符之前的值,如果前面的值为null,则返回运算符之后的值。

在这种情况下,通过将表达式的第二部分包装在params中,如果_requiredFieldValidator为空,则在返回之前将新对象分配给__requiredFieldValidator后备字段。

如果没有括号,则在返回之前不会分配,这会导致以下编译错误:

  

作业的左侧必须是变量,属性或   索引

括号保证正确评估赋值表达式。

答案 1 :(得分:4)

是的,他们是一样的。

??null coalescing operator。如果??左侧的操作数不为null,它将使用该东西,否则它将使用右侧的操作数。

在你的情况下,如果已经初始化它将返回_requiredFieldValidator,否则它将首先初始化然后返回它。

答案 2 :(得分:4)

是的,它们是一样的。 ?? Null Coalescence Operator ,它检查第一个操作数与null,如果它是null,则返回/运行第二个操作数。

第二个代码块显示"如果它不是_someProperty,则返回null。但是,如果 null,则设置_someProperty = new SomeType()并返回。"

答案 3 :(得分:4)

我认为这里最混乱的不是来自??运营商。很多人不知道C#中的Assignment operator会返回右手值,因为它的结果。