106 votes

Instanciation en ligne d'une liste de constantes

J'essaie de faire quelque chose comme ça:

 public const List<String> METRICS = new List<String>()
        {
            SourceFile.LOC,
            SourceFile.MCCABE,
            SourceFile.NOM,
            SourceFile.NOA,
            SourceFile.FANOUT,
            SourceFile.FANIN,
            SourceFile.NOPAR,
            SourceFile.NDC,
            SourceFile.CALLS
        };
 

Mais malheureusement, cela ne fonctionne pas:

 FileStorer.METRICS' is of type 'System.Collections.Generic.List<string>'. A const field of a reference type other than string can only be initialized with null.
 

Comment puis-je résoudre ce problème?

202voto

Jon Skeet Points 692016

const est pour les constantes de compilation. Vous pourriez simplement faire static readonly, mais qui ne s'appliquerait qu'à l' METRICS variable (qui devraient normalement être les actes de naissance au lieu de cela, par .NET conventions de nommage). Il ne fera pas la liste immuable - donc, quelqu'un pourrait appeler METRICS.Add("shouldn't be here");

Vous souhaiterez peut-être utiliser un ReadOnlyCollection<T> pour l'envelopper. Par exemple:

public static readonly IList<String> Metrics = new ReadOnlyCollection<string>
    (new List<String> { 
         SourceFile.LoC, SourceFile.McCabe, SourceFile.NoM,
         SourceFile.NoA, SourceFile.FanOut, SourceFile.FanIn, 
         SourceFile.Par, SourceFile.Ndc, SourceFile.Calls });

ReadOnlyCollection<T> seulement enroule une potentiellement mutables collection, mais que rien d'autre n'aura accès à l' List<T> par la suite, vous pouvez considérer l'ensemble de la collection comme immuable.

(La capitalisation est ici essentiellement la conjecture - à l'aide de fuller noms de les rendre plus clairs, de l'OMI.)

Si vous le déclarer comme IList<string>, IEnumerable<string>, ReadOnlyCollection<string> ou quelque chose d'autre est à vous... si vous vous attendez à ce qu'il ne devrait être traitée comme une séquence, alors IEnumerable<string> serait probablement plus approprié. Si l'ordre des questions et que vous voulez les gens à être en mesure d'y accéder par index, IList<T> peut être approprié. Si vous voulez faire de l'immuabilité apparente, déclarer ReadOnlyCollection<T> pourrait être utile, mais inflexible.

26voto

LukeH Points 110965

Vous devrez utiliser une liste static readonly place. Et si vous souhaitez que la liste soit immuable, vous pouvez envisager d'utiliser ReadOnlyCollection<T> plutôt que List<T> .

 private static readonly ReadOnlyCollection<string> _metrics =
    new ReadOnlyCollection<string>(new[]
        {
            SourceFile.LOC,
            SourceFile.MCCABE,
            SourceFile.NOM,
            SourceFile.NOA,
            SourceFile.FANOUT,
            SourceFile.FANIN,
            SourceFile.NOPAR,
            SourceFile.NDC,
            SourceFile.CALLS
        });

public static ReadOnlyCollection<string> Metrics
{
    get { return _metrics; }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X