Public Read-Only数组数据成员 - 类Constructor之外的更新

时间:2012-07-22 22:25:03

标签: c# arrays readonly

有人可以告诉我这是否可行。我正在寻找微软在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....
        }
    }
}

3 个答案:

答案 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)

与其他两张海报一样,改变被引用的项目没有任何问题。只有在读取时才能更改引用本身。

所以你想要的不是一个可修改的数组,而是一些定义后不可修改的其他结构。我不会给你一个完整的解决方案,但是你应该查看IEnumerableIEnumerator接口:http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx