[英]Difference between var and IEnumerable in C#?
我讀此文章,了解VAR和IEnumerable之間的差異。 作者寫了如下四點
點號 我對3和4不清楚。 請通過示例幫助理解這些觀點
此處的所有內容都不對,因此至少要簡短一點:
var
不會改變這一點; IEnumerable
通常只是做代表內存中的集合(它不就得了,頭腦,因為它是唯一的堅持,不管他們最終存儲的合同集合TOI)和觀念在很大程度上並列這個問題的休息; 不過,請注意使用var
來給出更廣泛的概念:使用var
通常僅是在根據當前語句得出的結果類型明顯時才是一個好主意-我真的不理解Darren的推理或如何很有用,但請考慮以下因素:
var results0 = new List<string>(); // assignment type is obvious
var results1 = something.GetResult(); // read must investigate to know
var
是上下文關鍵字,它隱式地鍵入變量。 當您使用IEnumerable<T>
您將明確說明要定義的類型,因為var將使用類型推斷。
使用哪一種並沒有真正的區別,更多的是使用IMO的編碼樣式,當我使用LINQ
而不是IEnumerable<T>
或IQueryable<T>
從集合中返回內容時,我個人使用var
。
var value5 = list.Where(i => i == 5).ToList();
IEnumerable<int> value5 = list.Where(i => i == 5).ToList();
兩者將產生相同的輸出。
關於第3點和第4點,我認為IEnumerable對內存收集根本沒有任何好處。 在后台, CLR
將在運行時推斷變量類型(使用var時),最有可能是IEnumerable<T>
。
var
只是一個隱式類型的局部變量。 您只需讓編譯器確定類型。
var i = 10; // Implicitly typed
int j = 10; // Explicitly typed
當使用匿名類型時,例如,它也非常方便。
var anon = new { Foo = "Bar" };
Console.WriteLine(anon.Foo); // Puts "Bar" on console.
如果有人說var MyList = SomeStringCollection.ToList()
; MyEnumerator = MyList.GetEnumerator(); , then the type of
MyList , and the type of
will be
List , and the type of
MyEnumerator , and the type of
will be
List.Enumerator , which is a *value type* that implements
IEnumerator的“ , which is a *value type* that implements
, and will thus exhibit *value semantics*. If the type of
, and will thus exhibit *value semantics*. If the type of
MyList的, the return type of
had been
IEnumerable , the return type of
MyList.GetEnumerator() , the return type of
would have been
IEnumerator`,它具有參考語義 。
如果例如一個方法具有從IEnumerator<String>
讀取五個項的方法,則這種區別可能很重要。 如果使用變量IEnumerator<String>
多次調用這樣的方法,則每次調用都會從枚舉中讀取下五個項目。 相比之下,如果使用值類型如List<String>.Enumerator
多次調用這種方法,則每次調用會將枚舉狀態復制到實現IEnumerator<T>
的新堆對象中,然后將該對象傳遞給方法(將讀取其中的五個項目),然后放棄該對象及其關聯的空間(不影響與原始變量關聯的枚舉狀態)。
請注意,在大約99%的情況下,值語義或引用語義在枚舉器中同樣可以接受; 在大多數情況下,值語義將使代碼運行速度更快,而很少使代碼運行速度顯着降低。 此外,在某些情況下,知道枚舉器將充當值類型可能會在語義上有用(例如,如果希望能夠重復重新枚舉集合的一部分)。 另一方面,對於使用IEnumerator<T>
實現的代碼來了解它們可能使用的實現類型,這可能是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.