我有一个类:
class SomeTests {
private Guid[] someGuids = new Guid[] { ... }
public void ThoseGuidsShouldAlwaysBeThere() {
foreach (Guid g in someGuids) { // error appears here
// ...
}
}
}
从语义上讲,我希望someGuids
为const
,因为除了重新编译代码之外,它们不应该被更新。但添加const
关键字会生成error CS0168:null is not valid in this context.
在这个错误的MSDN页面上,我觉得编译器认为我这样做了:
foreach (Guid g in null) {
我不明白添加const
如何导致此问题,以及如何解决我的语义问题(列表是只读的,不可写的) - 将其保存为数组而不是List是“几乎“足够好。
答案 0 :(得分: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() });
该集合将不再能够重新实例化,也无法修改其成员。
答案 1 :(得分:2)
尝试使Guid[]
成为常量应该会给出错误“除了字符串之外的引用类型的const字段只能用null初始化。”
改为readonly
:
private readonly Guid[] someGuids = new Guid[] { Guid.NewGuid() };
如果是readonly
,您还可以在构造函数中指定值:
public SomeTests()
{
someGuids = new[] { Guid.NewGuid(), Guid.NewGuid() };
}
正如Jeffery在评论中提到的,此解决方案阻止重新分配someGuids
,但仍可以修改项目。 Jeffery在他的回答中解决了这个问题。