Kri*_*iss 5 c# arrays msdn code-analysis visual-studio-2012
关于CA1819 msdn性能警告规则:
属性返回的数组不受写保护,即使该属性是只读的。为了保持数组防篡改,该属性必须返回数组的副本。通常,用户不会理解调用此类属性对性能的不利影响。具体来说,他们可能会将该属性用作索引属性。
我想知道其他对象在由属性返回时是否可变,或者这是否只发生在数组中?如果它只对数组有效,为什么?
假设你有:
int[] ints = new int[] { 1, 2, 3, 4 }
public int[] Ints { get { return ints; } }
Run Code Online (Sandbox Code Playgroud)
您班级的消费者可以执行以下操作:
instance.Ints[0] = 10;
Run Code Online (Sandbox Code Playgroud)
所以你允许修改类的数据。
为了防止这种情况,你可以这样做:
public IEnumerable<int> Ints { get { return ints; } }
Run Code Online (Sandbox Code Playgroud)
所以你的类的使用者只能读取值而不能修改。
现在,为什么?
set
好吧,如果您想修改数组的数据,这取决于您的类的设计,该警告会警告您这样一个事实:也许您希望无法操作数组的值,因为您在属性中没有 a 。
PS:有很多方法,例如只读集合等...,可以防止更改您的集合
看看这个