【问题标题】:CA1819: Properties should not return arrays. Does this rule apply for other objects too?CA1819:属性不应返回数组。此规则是否也适用于其他对象?
【发布时间】:2013-09-09 13:35:56
【问题描述】:

关于 CA1819 msdn 性能警告规则:

属性返回的数组没有写保护,即使 属性是只读的。为了保持阵列防篡改,属性 必须返回数组的副本。通常,用户不会理解 调用此类属性对性能的不利影响。 具体来说,他们可能会将属性用作索引属性。

我想知道其他对象在由属性返回时是否可变,或者这只发生在数组中?如果只对数组有效,为什么?

【问题讨论】:

标签: c# arrays visual-studio-2012 code-analysis msdn


【解决方案1】:

假设你有:

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; } }

所以你的类的消费者只能读取值而不能修改。

现在,为什么?

好吧,如果你想修改数组的数据,这取决于你的类的设计,警告会警告你这样一个事实,即你可能期望数组的值不能被操纵,因为你没有 @ 987654325@在属性中。

PS:有很多方法,例如只读集合等...,可以防止更改您的集合

看看this

【讨论】:

  • 感谢您的回答。我已经尝试过使用对象(字符串)并且它不允许我修改字符串的值,我想知道是否有任何其他对象像数组一样是可变的(这是否发生在任何其他对象类型上)?再次感谢。
  • 感谢您的回答。我想知道其他对象类型是否也会发生这种情况,(我尝试使用字符串执行此操作,但它不允许修改),除了数组之外,是否还有其他可变对象?再次感谢。
  • 对象本身是不可变的,你可以改变它的数据,一般的集合都会出现问题,比如List&lt;T&gt;等。
  • 我们可以说这种情况下唯一的可变对象是数组,而其他类型的对象(如 List 等)不会发生这种情况。例如,我有私有 IDbCommand idbCommand;和属性: public IDbCommand Command { get { return idbCommand; } } 是 idbCommand 可变的???非常感谢。
  • 你能告诉我为什么这只发生在数组上吗?
猜你喜欢
  • 2011-12-10
  • 1970-01-01
  • 2014-12-06
  • 2020-10-04
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多