内联实例化常量列表


102

我尝试做这样的事情:

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.

我怎么解决这个问题?



4
注意:关闭此问题作为重复项是一个错误。链接的问题与常量数组有关,此问题与常量列表有关。尽管这两种方法提供的功能大致相同,但它们是不同的,答案也不同。仅提及此问题的答案ReadOnlyCollection。问题是相关的,但都不是重复的。
Athari 2014年

Answers:


192

const用于编译时常量。您可以这样static readonly,但这仅适用于METRICS变量本身(根据.NET命名约定,通常应为Metrics )。它不会使列表不变-因此有人可以打电话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>可以声明它很方便-但不灵活。


2
我是来这里找new List<string>{ ... }零件的。谢谢乔恩:)
杰森

1
我想有一个原因,但对我来说这是奇怪的是,ReadOnlyCollection器物IList<>的暴露.Add
AaronLS

25

您将需要使用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; }
}

-5

您正在寻找一个简单的代码,如下所示:

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

这不能回答问题,因为属性的实例化是发问者的需要。
vchan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.