Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CA1819:属性不应返回数组。这个规则是否也适用于其他对象?_C#_Arrays_Visual Studio 2012_Code Analysis_Msdn - Fatal编程技术网

C# CA1819:属性不应返回数组。这个规则是否也适用于其他对象?

C# CA1819:属性不应返回数组。这个规则是否也适用于其他对象?,c#,arrays,visual-studio-2012,code-analysis,msdn,C#,Arrays,Visual Studio 2012,Code Analysis,Msdn,关于CA1819 msdn性能警告规则: 属性返回的数组不受写保护,即使 属性是只读的。为了使数组不受篡改,属性 必须返回数组的副本。通常,用户不会理解 调用此类属性对性能的不利影响。 具体来说,他们可能会将该属性用作索引属性 我想知道当属性返回时,其他对象是否是可变的,或者这是否只发生在数组中?如果它只对数组有效,为什么?假设您有: int[] ints = new int[] { 1, 2, 3, 4 } public int[] Ints { get { return ints; } }

关于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; } }
public IEnumerable int{get{return int;}
因此,类的使用者只能读取值,而不能修改

现在,为什么

如果你想修改数组的数据,这取决于你的类的设计。警告警告提醒你,可能你期望数组的值不能被操作,因为你没有在属性中设置

PS:有很多方法,比如只读集合等等,来防止改变你的集合


请查看

可能重复的感谢回答。我已经使用对象(字符串)尝试过这个方法,但它不允许我修改字符串的值,我想知道是否有任何其他对象像数组一样是可变的(这种情况是否发生在任何其他对象类型上)?再次感谢,谢谢你的回答。我想知道,如果这种情况也发生在其他类型的对象上,(我试着用字符串来做,但它不允许修改),除了数组之外,还有其他可变的对象吗?再次感谢。对象本身是不可变的,您可以更改它的数据,一般情况下收集时会出现问题,如
List
等。我们可以说这种情况下唯一可变的对象是数组,而其他类型的对象如List等不会发生这种情况。例如,我有私有IDbCommand;和属性:publicIDBCommand{get{returnIDBCommand;}}}IDbCommand是可变的吗???非常感谢。你能告诉我为什么这只发生在数组中吗?