是否有一种简写方法来返回可能为null的值?

时间:2016-07-08 12:36:32

标签: c# null-coalescing-operator null-coalescing

如何编写以下方案的简写?

get
{
    if (_rows == null)
    {
        _rows = new List<Row>();
    }

    return _rows;
}

11 个答案:

答案 0 :(得分:81)

使用null-coalescing operator(??):

get 
{ 
     _rows = _rows ?? new List<Row>(); 
     return _rows; 
}

OR(不太可读):

get { return _rows ?? (_rows = new List<Row>()); }
  

?? operator被称为null-coalescing运算符。它返回   如果操作数不为空,则为左操作数;否则它返回   右手操作。

答案 1 :(得分:41)

这是一个懒惰的初始化模式,所以直截了当的方法是使用Lazy<T>类。

class Foo
{
    Lazy<List<Row>> _rows;

    public Foo()
    {
        _rows = new Lazy(() => new List<Row>());
    }

    public List<Row> Rows
    {
        get { return _rows.Value; }
    }
}

这具有额外的优点,即它不会污染&#34;具有初始化逻辑的getter。

答案 2 :(得分:20)

我建议使用三元运算符

get {
  return _rows == null ? _rows = new List<Row>() : _rows;
}

或者因为空List<Row>没有带来太多开销,为什么不摆脱显式_row字段并实现只读属性( C#6.0 语法) :

public IList<Row> Rows {get;} = new List<Row>();

答案 3 :(得分:18)

以下是一个更好的主意:防止_rows成为null

让构造函数初始化变量:

public MyClass()
{
    this._rows = new List<Row>();
}

然后你的财产只是

get
{
    return this._rows;
}

确保如果您需要&#34;清除&#34;变量,您始终调用其Clear方法或指定新的空列表,而不是分配null。如果您真的需要在整个班级中使其清晰且一致,可能会在方法中对该操作进行编码。

很多更符合逻辑。如果您的变量永远不应该是null,那么永远不应该是null 。它还巧妙地避免了条件和具有getter修改状态的问题。

答案 4 :(得分:12)

List<Row> _rows;
public List<Row> Rows => _rows ?? (_rows = new List<Row>());

答案 5 :(得分:10)

正如其他人所说,您可以在此方案中使用null-coalescing运算符。

get
{
    return _rows ?? (_rows = new List<Row>());
}

值得注意的是,这是ReSharper非常善于建议的变化(他们称之为quick-fix)。

在您的示例中,它会在if语句下放置一个小的波形。将鼠标悬停在其上会显示suggestion代码如何更改/简化代码。

Convert to '??' expression

稍后点击几下,即可实施更改。

enter image description here

答案 6 :(得分:5)

就像这样:

get{ return _rows ?? (_rows = new List<Row>()); }

答案 7 :(得分:3)

如果您希望代码的行为与当前代码相似,则在访问属性时懒洋洋地初始化您的支持字段,然后是,您可以缩短代码。您可以重命名支持字段,因为已经使用??回答将所有内容放在单个表达式中,当您拥有该单个表达式时,请使用C#6的新属性语法来避免编写get和{{1 }}:

return

希望,在你达到这一点之前,你会发现你已经变成了易于理解的代码,它可以完全按照你想要的方式完成你永远不想要维护的混乱。

保持您的代码完全不变。你可以缩短它,如图所示,但这并没有使它更好。

如果问题是需要更多时间来编写,因为您不断反复键入相同的代码,许多IDE提供了一些功能来插入模板,代码段或它们用于它的任何术语。这使您可以按照

的方式定义某些内容
List<Row>_;List<Row> Rows=>_??(_=new List<Row>());

然后,您的编辑会提示您输入特定的{Type},{Field},{Property},而不必每次都再次输入。

答案 8 :(得分:1)

return _rows ?? (_rows = new List<Row>());

答案 9 :(得分:0)

如果你真的想缩短它,我会删除额外的括号。

    get
    {
        if (_rows == null)
            _rows = new List<Row>();

        return _rows;
    }

答案 10 :(得分:0)

您可以通过以下任何方式执行此操作:

  
      
  • 条件运算符(?:)
  •   
  • Null-coalescing运算符(??)
  •   

使用条件运算符

get {
  return _rows == null ? new List<Row>() : _rows;
}

空合并运算符

get { 
  return _rows ?? new List<Row>(); 
}