2016-07-01 55 views
0

在下面的程序中,(!testlist.Any())會拋出一個參數爲空的異常。 Any()擴展方法默認處理空值嗎?Any()擴展方法是否處理空值?

這是什麼方法?在方法中使用List<int>作爲參數時,是否應在Any()之前添加空檢查?

public class Program 
    { 
     public static void Main(string[] args) 
     { 

      Console.WriteLine("Hello, world!"); 

      foo(null); 
     } 

     public static void foo(List<int> testlist) 
     { 
      if (!testlist.Any()) 
      { 
       Console.WriteLine("testlist is empty!"); 
      } 
     } 
    } 
+0

'如果(!?testList。任何()??假){doStuff( testList); }'除非你想重新拋出異常。 – Mephy

+4

它通過拋出異常來「處理」集合的空值。 –

+0

如果源或謂詞爲空,則拋出'ArgumentNullException' –

回答

6

應該空校驗之前加入任何()當列表被用作方法的 參數?

是的,這是正確的做法。該方法應該快速失敗並提供有意義的消息。

public static void foo(List<int> testlist) 
{ 
    if(testlist == null) 
     throw new ArgumentNullException(nameof(testlist), $"{nameof(testlist)} must not be null"); 
    if (!testlist.Any()) 
    { 
     Console.WriteLine("testlist is empty!"); 
    } 
} 

當然Enumerable.Any不處理這個給你。這可能是null傳遞給此方法的一個錯誤,或者它可能是一個可行的選項。 只有你知道

例外也documented

ArgumentNullException:源爲空。」

如果你不想扔掉它,但你要接受空,只處理這種情況:

if(testlist == null || !testlist.Any()) 
{ 
    Console.WriteLine("testlist is null or empty!"); 
} 
else .... 
+0

或者它應該不會失敗,如果該方法的合約說空'testList'確定。我不認爲這是一個很好的解決方案,但是OP可能會出現這種情況。 –

+0

使用此方法的用戶不是技術性的。他們仍然可以傳遞null值,並且該方法可以在這種情況下返回「emptylist」 –