簡體   English   中英

C#中var和IEnumerable之間的區別?

[英]Difference between var and IEnumerable in C#?

我讀文章,了解VAR和IEnumerable之間的差異。 作者寫了如下四點

  1. 當您想即時創建“自定義”類型時,請使用Var類型。
  2. 當您已經知道查詢結果的類型時,請使用IEnumerable。
  3. Var也適用於遠程收集。
  4. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM