[c#] 상수 목록의 인라인 인스턴스화

나는 다음과 같이 시도합니다.

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
        };

그러나 불행히도 이것은 작동하지 않습니다.

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.

이 문제를 어떻게 해결할 수 있습니까?



답변

const컴파일 타임 상 수용입니다. 당신은 할 수 단지 그것을 할 static readonly,하지만 그건 단지에 적용됩니다 METRICS(에 의해 일반적으로 대신 메트릭해야한다 변수 자체 .NET 명명 규칙 ). 목록을 변경할 수 없게 만들지 않습니다.METRICS.Add("shouldn't be here");

a를 사용 ReadOnlyCollection<T>하여 포장 할 수 있습니다. 예를 들면 :

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>잠재적으로 변경 가능한 컬렉션을 래핑하지만 다른 어떤 것도 List<T>이후에 액세스 할 수 없으므로 전체 컬렉션을 변경 불가능한 것으로 간주 할 수 있습니다.

(여기서 대문자는 대부분 추측입니다. 전체 이름을 사용하면 IMO가 더 명확 해집니다.)

당신이로 선언하든 IList<string>, IEnumerable<string>, ReadOnlyCollection<string>당신은 다음, 그것은 단지 순서로 처리해야 기대하는 경우 또는 뭔가 다른 … 당신에게 달려 IEnumerable<string>아마도 가장 적절할 것이다. 순서가 중요하고 사람들이 색인으로 액세스 할 수 있도록하려면 IList<T>적절할 수 있습니다. 불변성을 분명하게 만들고 싶다면 ReadOnlyCollection<T>편리 할 수 ​​있지만 융통성이 없다고 선언하십시오 .


답변

static readonly대신 목록 을 사용해야합니다 . 목록을 변경할 수 없도록하려면 . ReadOnlyCollection<T>대신 사용을 고려할 수 있습니다 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; }
}


답변

다음과 같은 간단한 코드를 찾고 있습니다.

    List<string> tagList = new List<string>(new[]
    {
         "A"
        ,"B"
        ,"C"
        ,"D"
        ,"E"
    });


답변