AllKeys
es una operación O(n)
, mientras que Keys
es O(1)
. Esto se debe a que AllKeys
copia las claves en una nueva matriz, mientras que Keys
simplemente devuelve una referencia a la colección de claves privadas de NameValueCollection
. Por lo tanto, más allá de la diferencia de rendimiento, la colección devuelta por Keys
cambiará con la colección base, ya que es solo una referencia al original, mientras que AllKeys
estará aislada de los cambios porque es una copia.
Este pequeño programa de prueba muestra la diferencia de comportamiento:
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();
}
}
La salida es:
Keys: 1
AllKeys: 0
Eso es lo que estoy pensando también. Seguramente pensarías que una gran diferencia como esa sería explícita en la documentación. (O tal vez nombrado un poco mejor para reflejar la semántica). Por lo general, la documentación de MSDN es bastante excelente sobre cosas así. Es por eso que este me tiró con la guardia baja. – MojoFilter
+1 buena prueba para probar el punto. – BFree
De acuerdo, mala reputación y semántica confusa. Sin mencionar que FxCop no le gusta a las propiedades que devuelven matrices por esta misma razón. Como esta clase es un remanente de los días previos a los genéricos, tal vez el diccionario o el sería mejor ahora? –