4

我有一个像这样的课程:

class SomeTests {
  private Guid[] someGuids = new Guid[] { ... }

  public void ThoseGuidsShouldAlwaysBeThere() {
    foreach (Guid g in someGuids) { // error appears here
        // ...
    }
  }
}

从语义上讲,我想someGuids成为const,因为它们不应该被更新,除非在重新编译代码之前。但是添加const关键字会产生错误 CS0168null is not valid in this context.

阅读该错误的 MSDN 页面,在我看来编译器认为我正在这样做:

foreach (Guid g in null) {

我不明白在这里添加是如何const导致这个问题的,以及如何解决我的语义问题(列表是只读的,不可写)——将其保留为数组而不是列表“几乎”足够好。

4

2 回答 2

3

此用法中的readonly关键字有点误导。将其视为防止集合被重新实例化而不是修改。

例子:

 private readonly Guid[] someGuids = new Guid[] { Guid.NewGuid() };

 //This will not compile because it is read-only.
 someGuids = new Guid[] { Guid.NewGuid() };

 //This still compiles, and the first member will be changed
 someGuids[0] = Guid.NewGuid();

我建议您考虑与关键字System.Collections.ObjectModel.ReadOnlyCollection<T>结合使用。readonly

例子:

    public readonly ReadOnlyCollection<Guid> someGuids = new
       ReadOnlyCollection<Guid>(new Guid[] { Guid.NewGuid(), Guid.NewGuid() });

该集合将不再能够被重新实例化,其成员也不能被修改。

于 2012-12-20T18:04:17.510 回答
2

尝试创建Guid[]一个常量应该会给您一个错误“除字符串之外的引用类型的常量字段只能用 null 初始化。”

readonly改为:

private readonly Guid[] someGuids = new Guid[] { Guid.NewGuid() };

当它是readonly你也可以在构造函数中分配值:

public SomeTests()
{
    someGuids = new[] { Guid.NewGuid(), Guid.NewGuid() };
}

正如 Jeffery 在评论中提到的,此解决方案可防止someGuids重新分配,但仍可以修改项目。杰弗里在他的回答中解决了这个问题。

于 2012-12-20T17:22:53.003 回答