J'essaye 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?
ReadOnlyCollection
. Les questions sont liées, mais aucune n'est en double.Réponses:
const
est pour les constantes de compilation. Vous pouvez simplement le fairestatic readonly
, mais cela ne s'appliquerait qu'à laMETRICS
variable elle-même (qui devrait généralement être des métriques à la place, selon les conventions de dénomination .NET ). Cela ne rendrait pas la liste immuable - pour que quelqu'un puisse appelerMETRICS.Add("shouldn't be here");
Vous voudrez peut-être utiliser un
ReadOnlyCollection<T>
pour l'envelopper. Par exemple:ReadOnlyCollection<T>
encapsule juste une collection potentiellement mutable, mais comme rien d'autre n'aura accès à laList<T>
suite, vous pouvez considérer la collection globale comme immuable.(La capitalisation ici est principalement une supposition - l'utilisation de noms plus complets les rendrait plus clairs, IMO.)
Que vous déclarez comme
IList<string>
,IEnumerable<string>
,ReadOnlyCollection<string>
ou quelque chose d' autre à vous ... si vous attendez qu'il ne doit être traitée comme une séquence, puisIEnumerable<string>
serait probablement plus approprié. Si l'ordre est important et que vous souhaitez que les utilisateurs puissent y accéder par index, celaIList<T>
peut être approprié. Si vous voulez rendre l'immuabilité apparente, déclarez-la commeReadOnlyCollection<T>
étant pratique - mais inflexible.la source
new List<string>{ ... }
pièce. Merci Jon :)ReadOnlyCollection
implémenteIList<>
comme cela expose.Add
Vous devrez utiliser un
static
readonly
liste à la place. Et si vous souhaitez que la liste soit immuable, vous pouvez envisager d'utiliserReadOnlyCollection<T>
plutôt queList<T>
.la source
Vous recherchez un code simple, comme celui-ci:
la source