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