c# - removeat - unity list find




在foreach(項目中的T項)之前if(items!= null)是多餘的嗎? (8)

我經常遇到如下代碼:

if ( items != null)
{
   foreach(T item in items)
   {
        //...
   }
}

基本上, if條件確保僅當items不為null時foreach塊才會執行。 我想知道是否確實需要if條件,或者如果items == nullforeach將處理這種情況。

我的意思是,我可以簡單地寫一下

foreach(T item in items)
{
    //...
}

不用擔心items是否為空? if條件是多餘的嗎? 或者這取決於items類型或者也可能在T


你仍然需要檢查if(items!= null)否則你會得到NullReferenceException。 但是你可以這樣做:

List<string> items = null;  
foreach (var item in items ?? new List<string>())
{
    item.Dump();
}

但你可能會檢查它的表現。 所以我仍然希望首先使用if(items!= null)。

根據Eric的Lippert建議,我將代碼更改為:

List<string> items = null;  
foreach (var item in items ?? Enumerable.Empty<string>())
{
    item.Dump();
}

你確實需要這個。 當foreach訪問容器以設置迭代時,您將獲得異常。

在封面下, foreach使用在集合類實現的接口來執行迭代。 通用等效接口在here

C#語言的foreach語句(對於Visual Basic中的每個語句)隱藏了枚舉器的複雜性。 因此,建議使用foreach而不是直接操作枚舉器。


使用C#6,您可以將新的空條件運算符與List<T>.ForEach(Action<T>) (或您自己的IEnumerable<T>.ForEach擴展方法)一起使用。

List<string> items = null;
items?.ForEach(item =>
{
    // ...
});

在C#6中你可以這樣寫:

// some string from file or UI, i.e.:
// a) string s = "Hello, World!";
// b) string s = "";
// ...
var items = s?.Split(new char[] { ',', '!', ' ' }) ?? Enumerable.Empty<string>();  
foreach (var item in items)
{
    //..
}

它基本上是弗拉德貝茲登的解決方案,但使用?? 表達式總是生成一個非null的數組,因此在foreach中存活而不是在foreach括號內進行此檢查。


它不是超級豐富的。 在運行時,項目將被轉換為IEnumerable,並將調用其GetEnumerator方法。 這將導致取消引用將失敗的項目



測試是必要的,因為如果集合為null,foreach將拋出NullReferenceException。 嘗試它實際上非常簡單。

List<string> items = null;
foreach(var item in items)
{
   Console.WriteLine(item);
}

第二個將拋出NullReferenceException ,消息Object reference not set to an instance of an object.





iteration