我有一个具有整数数组属性的类,我正在尝试为它找出正确的语法。 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块语法如何工作?我怎样才能发送正确的索引?我有什么要初始化的?
答案 0 :(得分:22)
您在寻找:
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; }
}
答案 1 :(得分:11)
CA1819:属性不应返回数组
http://msdn.microsoft.com/en-us/library/0fss9skc.aspx
属性返回的数组不受写保护,即使该属性是只读属性也是如此。为了防止数组防篡改,属性必须返回数组的副本。通常,用户不会理解调用此类属性的不利性能影响。具体来说,他们可能会将该属性用作索引属性。
要修复违反此规则的问题,请将属性设为方法或更改属性以返回集合而不是数组
答案 2 :(得分:1)
如果数组中元素的数量是固定的,我只会为数组提供一个getter并且不用设置器。您仍然可以为数组中的单个元素赋值,但这会阻止某人将整个数组从您下面交换(或将其设置为null
。代码如下所示:
class DemoClass
{
public int[] MyNumbers
{ get; private set; }
public DemoClass(int elements)
{
MyNumbers = new int[elements];
}
}
如果元素的数量没有固定,那么你应该使用List<int>
而不是数组,然后肯定想要一个没有setter的属性。
答案 3 :(得分:0)
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.
}
}
答案 4 :(得分:0)
它被称为Auto-Implemented Properties。所以,如果你有像
这样的语法public int[] MyNumbers { get; set; }
C#编译器会自动为您创建后备字段。此功能是在C#3.0中引入的,在此之前,您始终必须使用支持字段实现属性。
您可以在以下网址了解详情:New C# "Orcas" Language Features: Automatic Properties, Object Initializers, and Collection Initializers
答案 5 :(得分:-2)
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};
}
}