2012-01-10 114 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