1)我讀了一些(通用)代碼片段,看到一些使用IList<T>
的地方,一些使用IEnumerable
。第一個使用後者的優點是什麼?爲什麼在IEnumerable上使用IList?
2)is
and as
in c#。 我明白is
確實類型檢查和as
不鑄造。 但究竟是鑄造什麼?強制數據到一些大小的對象?當is
和as
有什麼不同?
1)我讀了一些(通用)代碼片段,看到一些使用IList<T>
的地方,一些使用IEnumerable
。第一個使用後者的優點是什麼?爲什麼在IEnumerable上使用IList?
2)is
and as
in c#。 我明白is
確實類型檢查和as
不鑄造。 但究竟是鑄造什麼?強制數據到一些大小的對象?當is
和as
有什麼不同?
甲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
...即是obj
和IList
?是或否。
as
執行「嘗試做這個」類型檢查;如果失敗,則返回null
,如果成功,則返回類型化引用(等)。基本上,這是一個效率的事情:
if(obj is IList) {
var list = (IList) obj;
...
}
少效率比:
var list = obj as IList;
if(list != null) {
...
}
他們也表現不同,如果obj
爲null; is
引發異常; as
返回null
。
IList
提供了IEnumerable
沒有的某些方法。最重要的是,添加到它的能力(更多信息,請查看msdn)is
比較類型,如果某個對象可以被轉換爲類型則返回。 as
實際上執行該演員,如果失敗返回null
。 Casting意味着將類型爲A
的對象轉換爲B
類型的對象,無論出於何種原因。大多數情況下,在C#中,轉換不會在類型之間轉換對象。通常,它只是在運行時檢查某個對象是否具有給定的編譯時類型,如果允許,則將該對象分配給該類型的變量。 (如果不是,返回'null'或拋出一個異常,這取決於你使用parens還是'as'。) – millimoose
實際上,它通常指的是強制,而不是轉換 –
你實際測量過這兩個性能嗎? 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。所以選擇應該是可讀性我會說 –
@RuneFS我經常在IL中編碼,所以我很清楚這一點。然而,不同之處在於在isinst之後的額外類型**。我承認,這是一個微小的差異。 –
我認爲JIT編譯器應該能夠優化那個classcast。但我不知道它現在是否會。 – CodesInChaos