2011-11-05 70 views
15

1)我讀了一些(通用)代碼片段,看到一些使用IList<T>的地方,一些使用IEnumerable。第一個使用後者的優點是什麼?爲什麼在IEnumerable上使用IList?

2)is and as in c#。 我明白is確實類型檢查和as不鑄造。 但究竟是鑄造什麼?強制數據到一些大小的對象?當isas有什麼不同?

回答

29

IList[<T>]表示東西:

  • 可以迭代
  • 是有限的,已知大小的
  • 是可重複的
  • 可以隨機通過索引
  • 可以(任選地被訪問,可選)進行編輯:重新賦值,添加,刪除等

另一方面,IEnumerable只能迭代。並非所有可以迭代的東西都是列表。例如:

static IEnumerable<int> Get() { 
    Random rand = new Random(); 
    while(true) yield return rand.Next(); 
} 

即^^^是一個無限序列。它沒有長度,不能突變,不能按索引訪問...但是,它可以重複:

foreach(int i in Get().Take(200)) { 
    Console.WriteLine(i); 
} 

is進行類型檢查,返回true/false ...即objIList?是或否。

as執行「嘗試做這個」類型檢查;如果失敗,則返回null,如果成功,則返回類型化引用(等)。基本上,這是一個效率的事情:

if(obj is IList) { 
    var list = (IList) obj; 
    ... 
} 

少效率比:

var list = obj as IList; 
if(list != null) { 
    ... 
} 

他們也表現不同,如果obj爲null; is引發異常; as返回null

+1

你實際測量過這兩個性能嗎? IL指令儘管它的名稱暗示它對應的實際上與as操作對應。 IL中沒有任何操作。實際上在IL中是'obj as type!= null' http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is。 ASPX。所以選擇應該是可讀性我會說 –

+1

@RuneFS我經常在IL中編碼,所以我很清楚這一點。然而,不同之處在於在isinst之後的額外類型**。我承認,這是一個微小的差異。 –

+0

我認爲JIT編譯器應該能夠優化那個classcast。但我不知道它現在是否會。 – CodesInChaos

3
  1. IList提供了IEnumerable沒有的某些方法。最重要的是,添加到它的能力(更多信息,請查看msdn
  2. is比較類型,如果某個對象可以被轉換爲類型則返回。 as實際上執行該演員,如果失敗返回null。 Casting意味着將類型爲A的對象轉換爲B類型的對象,無論出於何種原因。
+1

大多數情況下,在C#中,轉換不會在類型之間轉換對象。通常,它只是在運行時檢查某個對象是否具有給定的編譯時類型,如果允許,則將該對象分配給該類型的變量。 (如果不是,返回'null'或拋出一個異常,這取決於你使用parens還是'as'。) – millimoose

+0

實際上,它通常指的是強制,而不是轉換 –

相關問題