constè per le costanti in fase di compilazione. Si potrebbe solo rendere più static readonly, ma che si applicherebbe solo alla METRICSvariabile stessa (che dovrebbe essere tipicamente Metrics invece, da .NET convenzioni di denominazione ). Non renderebbe la lista immutabile, quindi qualcuno potrebbe chiamareMETRICS.Add("shouldn't be here");
Puoi usare un ReadOnlyCollection<T>per avvolgerlo. Per esempio:
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>avvolge solo una raccolta potenzialmente mutabile, ma poiché nient'altro avrà accesso a quella List<T>successiva, puoi considerare la raccolta complessiva come immutabile.
(Le maiuscole qui sono per lo più congetture: l'uso di nomi più completi li renderebbe più chiari, IMO.)
Sia che si dichiara come IList<string>, IEnumerable<string>, ReadOnlyCollection<string>o qualcos'altro sta a voi ... se vi aspettate che dovrebbe essere trattato solo come una sequenza, allora IEnumerable<string>sarebbe probabilmente più opportuno. Se l'ordine è importante e desideri che le persone possano accedervi tramite indice, IList<T>potrebbe essere appropriato. Se vuoi rendere evidente l'immutabilità, dichiararla come ReadOnlyCollection<T>potrebbe essere utile, ma inflessibile.