C#中的数组属性语法

时间:2011-08-11 18:56:12

标签: c# syntax

我有一个具有整数数组属性的类,我正在尝试为它找出正确的语法。 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块语法如何工作?我怎样才能发送正确的索引?我有什么要初始化的?

6 个答案:

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