Por que não um acesso dicionário chaves inexistentes como um Hashtable faz?

votos
4

Se eu estou usando um Hashtable, eu posso escrever código como este:

object item = hashtable[key] ?? default_value;

Que funciona ou não keyaparece no Hashtable.

Eu não posso fazer isso com um Dictionary<TKey. TValue>. Se a chave não está presente no dicionário, que irá lançar um KeyNotFoundException. Então eu tenho que escrever um código como este:

MyClass item;
if (!(dict.TryGetValue(key, out item))
{
   item = default_value;
}

Eu estou querendo saber o porquê disso. Dictionary<TKey, TValue>é apenas um invólucro em torno Hashtable. Por que esta restrição foi adicionado a ele?

Editar:

Por outra perspectiva sobre a resposta de PopCatalin (veja abaixo), o código que eu tinha escrito acima não vai funcionar se os valores do dicionário são de um tipo de valor. Se eu estou usando um Dictionary<int, int>, então o código que eu iria gostar de usar parece com isso:

int i = dict[key] ?? default_value;

E que não irá compilar, porque dict[key]não é um tipo anulável ou referência.

Publicado 30/12/2008 em 02:19
fonte usuário
Em outras línguas...                            


6 respostas

votos
7

A diferença entre um Dictionary<T>e um Hashtableé que um Dictionary<T>é um tipo genérico que pode se especializar para armazenar tipos de valor ao longo tipos de referência.

A tabela de dispersão pode apenas armazenar os tipos de referência (um Objectpassado por referência) e apenas tipos de valor que estão dentro de caixas (também passado por referência).

Quando um dicionário é especializada com tipos de valor, ele deve retornar esses valores 'por valor' não por reference.So, portanto, um Dictionary<T>não pode retornar nulo, como nula é não um valor válido para tipos de valor.

Respondeu 30/12/2008 em 04:13
fonte usuário

votos
4

Há um equívoco em seu post. Dicionário não é um invólucro em torno Hashtable. É uma implementação completamente diferente.

A razão pela qual esta alteração foi feita é justificada principalmente por uma afirmação: Null é um valor válido para um hashtable. Sem essa mudança não é possível distinguir entre uma chave não exsistent e uma chave de valor com um valor nulo usando o método [] de acesso. Dicionário apaga isso.

Respondeu 30/12/2008 em 02:28
fonte usuário

votos
2

Eu escrevi uma extensão para isso.

public static class DictionaryExtension
{
    public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey, TValue> items, string key)
    {
        if (items != null && items.ContainsKey(key))
        {
            return items[key];
        }

        return default(TValue);
    }
}
Respondeu 30/12/2008 em 03:41
fonte usuário

votos
1

Dictionary.ContainsKey é provavelmente melhor para você do que TryGetValue.

Mas por que motivo, nenhuma idéia.

Respondeu 30/12/2008 em 02:28
fonte usuário

votos
1

Se você olhar para o código usando reflector você verá que Dicionário tenta encontrar a chave e explicitamente levanta uma exceção se ele não encontrar a chave.

public TValue get_Item(TKey key)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        return this.entries[index].value;
    }
    ThrowHelper.ThrowKeyNotFoundException();
    return default(TValue);
}
Respondeu 30/12/2008 em 02:27
fonte usuário

votos
0

Tenho a certeza que esta restrição é uma das razões funcionais para a criação da embalagem em primeiro lugar.

Respondeu 30/12/2008 em 02:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more