System.Collections.Specialized.NameObjectCollectionBase有兩個相似的特性:NameValueCollection上的屬性Keys和AllKeys之間的區別是什麼?
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
難道他們提供不同的數據集?我什麼時候想要使用一個?
System.Collections.Specialized.NameObjectCollectionBase有兩個相似的特性:NameValueCollection上的屬性Keys和AllKeys之間的區別是什麼?
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
難道他們提供不同的數據集?我什麼時候想要使用一個?
AllKeys
是O(n)
操作,而Keys
是O(1)
。這是因爲AllKeys
將密鑰複製到新陣列中,而Keys
只是返回對NameValueCollection
的私鑰集合的引用。因此,除了性能差異之外,由Keys
返回的集合將隨基本集合而改變,因爲它僅僅是對原始參考的參考,而AllKeys
將與變更隔離,因爲它是副本。
這個小測試程序顯示在行爲差異:
using System;
using System.Collections.Specialized;
static class Program
{
static void Main()
{
var collection = new NameValueCollection();
var keys = collection.Keys;
var allKeys = collection.AllKeys;
collection.Add("Name", "Value");
Console.WriteLine("Keys: " + keys.Count);
Console.WriteLine("AllKeys: " + allKeys.Length);
Console.ReadLine();
}
}
輸出是:
Keys: 1
AllKeys: 0
然而,還有額外的好處,你可以使用foreach或LINQ語句對AllKeys()的返回進行操作。由於它是一個副本,因此您將不會在修改當前列舉的列表時遇到錯誤。
這就是我的想法。你一定會認爲這樣的重大差異將在文檔中明確。 (或者可能命名更好,以反映語義)。通常,MSDN文檔對於類似的東西非常優秀。這就是爲什麼這一個讓我無法防備的原因。 – MojoFilter 2009-04-29 18:00:32