2012-01-10 48 views
-1

这是一个错误还是我解释'??' - 操作符错误?查看下面的获取属性和评论。在C#3.5中'??'运算符的奇怪行为

我使用C#.NET 3.5

private List<MyType> _myTypeList; 

    private List<MyType> MyTypeList 
    { 
     get 
     { 
      //The two code lines below should each behave as the three under, but they don't? 
      //The ones uncommented are working, the commented result in my list always returning empty (newly created I suppose). 

      //return _myTypeList ?? new List<MyType>(); 
      //return _myTypeList == null ? new List<MyType>() : _myTypeList; 

      if (_myTypeList == null) 
       _myTypeList = new List<MyType>(); 
      return _myTypeList; 
     } 
    } 

编辑:对不起大家谁看了看问题,当它刚问,那里有它的一些错误,进行了迷惑大家。

感谢所有伟大和快速的反馈!我现在明白了我所犯的错误。 谢谢!

+3

我在您的代码示例中看不到'??'的用法。 – RedFilter 2012-01-10 16:16:04

回答

6

这条线:

return _myTypeList == null ? new List<MyType>() : _myTypeList; 

等同于:

if (_myTypeList == null) 
     return new List<MyType>(); 
    return _myTypeList; 

不会:

if (_myTypeList == null) 
     _myTypeList = new List<MyType>(); 
    return _myTypeList; 

??版本,你后来添加的,是如此不可读,我不会分析它。我们首先得到?

+0

这两个代码片段的语义没有区别,是吗? – 2012-01-10 16:18:58

+1

@IgorKorkhov有。在第一种情况下,如果首先为空,_myTypeList将保持为空。 – 2012-01-10 16:20:35

+1

Darrans:对不起,当然你是对的,我只是忽略了_myTypeList不是本地变量这一事实。 – 2012-01-10 16:23:28

1

您正在演示的代码不使用? (合并运营商)。相反,你正在使用三元运算符。

尝试

return _myTypeList ?? (_myTypeList = new List<MyType>()); 

代替。

检查了这一点:

 static void Main(string[] args) 
     { 
      var x = GetList(); 

      if(_theList == null) 
      { 
       Console.WriteLine ("_theList is null"); 
      } 
      else 
      { 
       Console.WriteLine ("_theList has been initialized."); 
      } 
      Console.ReadLine(); 
     } 

     private static List<int> _theList; 

     public static List<int> GetList() 
     { 
      return _theList ?? (_theList = new List<int>()); 
     } 

上面会输出代码 '_theList已初始化'。

您的注释行:如您所愿

//return _myTypeList == null ? new List<MyType>() : _myTypeList; 

行不通的,因为你不是(懒惰)的任何地方初始化_myTypeList。
_myTypeList == nul l总是会评估为true,因为_mytypeList从不初始化,因此,您将始终返回一个新的List实例。

+0

对不起,我的问题写得有点快。现在编辑它。你只是为了快速;) – Tim 2012-01-10 16:18:30

+0

OP已经这样做了。 – 2012-01-10 16:18:53

+0

不是当我打字我的答案。 :) – 2012-01-10 16:23:57

1

版本A:

return _myTypeList ?? (_myTypeList = new List<MyType>()); 

版B:

return _myTypeList == null ? new List<MyType>() : _myTypeList; 

版C:

if (_myTypeList == null) 
    _myTypeList = new List<MyType>(); 
return _myTypeList; 

A和C应该具有相同的行为。 B不应该 - 它不会将_myTypeList设置为新列表,它只会返回一个。你可以使用你在A版本使用相同的语法,使之等同:

return _myTypeList == null ? _myTypeList = new List<MyType>() : _myTypeList; 
5

如果必须使用??使用它像

_myTypeList = _myTypeList ?? new List<MyType>(); 
return _myTypeList; 

但一个简单的,如果是罚款,以及

3

当你使用语法

return _myTypeList == null ? new List<MyType>() : _myTypeList; 

如果_myTypeList为null,那么你返回一个新的MyType列表o f类型List()。 _myTypeList但仍然为空。你不要初始化它。

鉴于在第二种情况下,你实际上初始化_myTypeList,然后返回它。

1

??运算符表示:如果左边的操作数不是null,则操作的结果是左边的操作数。否则,操作的结果是右手操作数。即:

foo = bar ?? frob 

然后foo = bar如果bar != null,否则,foo = frob