나는 다음과 같이 시도합니다.
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"
});