web-dev-qa-db-fra.com

Comment initialiser ReadOnlyDictionary?

J'ai un dictionnaire immuable qui est exposé dans une classe.

Actuellement, mon code ressemble

using System.Collections.Generic;
using System.Collections.ObjectModel;

public class FooClass
{
    private static ReadOnlyDictionary<string, byte> _validRevisions 
        = new ReadOnlyDictionary<string, byte>(
            new Dictionary<string, byte>() { 
                { "1.0", 0x00 },
                { "1.1", 0x01 },
                { "1.2", 0x02 },
                { "1.3", 0x03 }
            } );

    public static ReadOnlyDictionary<string, byte> ValidRevisions => _validRevisions;

    // other FooClass contents...
}

J'ai utilisé le champ de support _validRevisions car je ne pouvais pas trouver une meilleure façon de créer une propriété de dictionnaire constant partagé. Existe-t-il une meilleure façon de gérer cela ou peut-être devrais-je simplement rendre le terrain public?

Ma principale question étant de savoir s'il existe un moyen plus court d'initialiser le _validRevisions champ lui-même? Créer un dictionnaire en ligne pour le passer dans un dictionnaire (qui se trouve être en lecture seule) semble un peu ... d'une odeur de code. C'est ça? Y a-t-il une meilleure façon?

EDIT: encore une chose à propos du ROD que je viens de remarquer, il n'y a pas de méthode pour prendre en charge la vérification s'il contient une valeur donnée ... y a-t-il une raison à cela liée à sa lecture seule?

12
Toby

Si cela ne vous dérange pas d'avoir un IReadOnlyDictionary au lieu d'un ReadOnlyDictionary, vous pouvez l'utiliser, car Dictionary implémente IReadOnlyDictionary:

private static IReadOnlyDictionary<string, byte> _validRevisions
    = new Dictionary<string, byte>
       {
           { "1.0", 0x00 },
           { "1.1", 0x01 },
           { "1.2", 0x02 },
           { "1.3", 0x03 }
        };

public static IReadOnlyDictionary<string, byte> ValidRevisions => _validRevisions;
12

Le ReadOnlyDictionary<TKey, TValue> est juste un wrapper autour d'un dictionnaire normal et il n'y a qu'un constructeur pour l'initialiser qui prend une autre instance Dictionary.

Donc non , il n'y a pas de moyen plus court. Mais j'utiliserais le constructeur statique pour initialiser des objets statiques complexes:

private static ReadOnlyDictionary<string, byte> _validRevisions;

static FooClass()
{
    IDictionary<string, byte> dict = new Dictionary<string, byte>() { 
            { "1.0", 0x00 },
            { "1.1", 0x01 },
            { "1.2", 0x02 },
            { "1.3", 0x03 }
        };
    _validRevisions = new ReadOnlyDictionary<string, byte>(dict);
}
8
Tim Schmelter