C#中的数组属性语法

我有一个具有整数数组属性的类,我正在尝试为它找出正确的语法。 int数组在类构造函数中实例化。

class DemoClass { private int[] myNumbers; public int[] MyNumbers { get { /* Some logic */ } set { /* Some logic */ } } public DemoClass(int elements) { // Here, the array should get instantiated using the elements. } } 

如果我希望我的客户端代码通过属性MyNumbers从数组中检索数字,get / set块语法如何工作? 我怎样才能发送正确的索引? 我有什么要初始化的?

你在找:

 class DemoClass { public int[] MyNumbers { get; private set; } public DemoClass(int elements) { MyNumbers = new int[elements]; } } 

对于除了公开私有字段(你似乎想要)之外什么都不做的普通属性:

 private int[] myNumbers; public int[] MyNumbers { get { return myNumbers; } set { myNumbers = value; } } 

CA1819:属性不应返回数组

http://msdn.microsoft.com/en-us/library/0fss9skc.aspx

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

要修复违反此规则的问题,请将该属性设为方法或更改属性以返回集合而不是数组

如果数组中元素的数量是固定的,我只会为数组提供一个getter并且不用设置器。 您仍然可以为数组中的各个元素赋值,但这样可以防止有人将整个数组从您下面交换(或将其设置为null 。代码如下所示:

 class DemoClass { public int[] MyNumbers { get; private set; } public DemoClass(int elements) { MyNumbers = new int[elements]; } } 

如果元素的数量没有固定,那么你应该使用List而不是数组,然后你肯定想要一个没有setter的属性。

  class DemoClass { private int[] myNumbers; public int[] MyNumbers { get { return myNumbers; } set { myNumbers = value; } } public DemoClass(int[] elements) { myNumbers = elements; // Here, the array should get instantiated using the elements. } } 

它被称为自动实现的属性 。 所以如果你有类似的语法

 public int[] MyNumbers { get; set; } 

C#编译器会自动为您创建后备字段。 此function是在C#3.0中引入的,在此之前,您始终必须使用支持字段实现属性。

您可以在以下位置阅读更多信息: 新C#“Orcas”语言function:自动属性,对象初始化程序和集合初始化程序

 class DemoClass { private int[] myNumbers; public int[] MyNumbers { get { return myNumbers; } set { myNumbers = value;} } public DemoClass(int elements) { // Here, the array should get instantiated using the elements. MyNumbers = new int[5] { 1, 2, 3, 4, 5}; } }