有人可以告诉我这是否可行。我正在寻找微软在GameState上为他们的XNA框架提供的代码示例。在其中一个类中,它们使用“Public ReadOnly”数组数据成员。虽然不是推广OO的做法,但并没有错。
该类稍后在构造函数中实例化它,到目前为止一直很好,它也记录在MSDN上。
问题:该类稍后在类方法中遍历数组并更改数组中的数据。我查看了MSDN并用谷歌搜索了它,我看到的任何地方都显示它将会出错。只读数组是否有特殊例外?
请告知。
public class InputState
{
public readonly KeyboardState[] CurrentKeyboardStates;
public readonly KeyboardState[] LastKeyboardStates;
public InputState()
{
CurrentKeyboardStates = new KeyboardState[max];
LastKeyboardStates = new KeyboardState[max];
}
//Does not make sense code...
public void Update()
{
for (int i=0; i < max; ++i)
{
//this should throw errors...
CurrentKeyboardStates[i] = LastKeyboardStates[i];
LastKeyboardStates[i] = Keyboard.GetState();
//more code....
}
}
}
答案 0 :(得分:1)
readonly
表示在构造函数中设置后,变量无法更改。但是,在这种情况下,这是对数组对象的引用,可以更改。
如果字段是值类型(例如int
),那么您的理解是正确的。该字段可以由初始化程序或任何构造函数设置。它与const
字段几乎相同。
但如果它是一个引用,那么我们可以保证的是它总是会引用同一个对象。是否可以修改该对象取决于其实现。因此,对于数组,您可以更改数组的内容,但不能更改其长度,例如。
请参阅readonly
的MSDN文档。
SLaks指出将通过代码分析生成此警告:CA2105: Array fields should not be read only。这是为了你的目的。标记数组readonly
会给您一种无法修改的错误安全感。但是,无法做的唯一事情就是为该字段分配不同的数组。
如果您想向外部公开一组信息,而不想更改它,最好的方法是IEnumerable<T>
属性:
public class Foo {
private int[] _data = new int[40];
public IEnumerable<int> Data {
get { return _data; }
}
}
这将允许该类的使用者迭代它,就像任何其他IEnumerable
一样:
Foo f = new Foo();
foreach (int d in f.Data) {
//...
}
f.Data[0] = 7; // This won't work. IEnumerable doesn't have [] operator.
f.Data = new int[10]; // This won't work. Data only has a getter.
答案 1 :(得分:1)
更改只读数组的元素非常好,您无法重新分配引用。 (无法将CurrentKeyboardStates / LastKeyboardStates设置为新数组等)可以更改元素值。
答案 2 :(得分:1)
与其他两张海报一样,改变被引用的项目没有任何问题。只有在读取时才能更改引用本身。
所以你想要的不是一个可修改的数组,而是一些定义后不可修改的其他结构。我不会给你一个完整的解决方案,但是你应该查看IEnumerable
和IEnumerator
接口:http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx。