Синтаксис свойства массива в C # - PullRequest
10 голосов
/ 11 августа 2011

У меня есть класс, у которого есть свойство целочисленного массива, и я пытаюсь выяснить правильный синтаксис для него.Массив 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.
    }
}

Как работает синтаксис блока get / set, если я хочу, чтобы мой клиентский код извлекал число из массива через свойство MyNumbers?Как я могу отправить это правильный индекс?Что мне нужно инициализировать?

Ответы [ 6 ]

22 голосов
/ 11 августа 2011

Вы ищете:

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; }
}
11 голосов
/ 25 августа 2013

CA1819: свойства не должны возвращать массивы

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

Массивы, возвращаемые свойствами, не защищены от записи, даже если свойство доступно только для чтения. Чтобы защитить массив от несанкционированного доступа, свойство должно возвращать копию массива. Как правило, пользователи не понимают негативных последствий для производительности при вызове такого свойства. В частности, они могут использовать это свойство как индексированное свойство.

Чтобы исправить нарушение этого правила, либо сделайте свойство методом, либо измените свойство, чтобы оно возвращало коллекцию вместо массива

1 голос
/ 11 августа 2011

Если число элементов в массиве фиксировано, я бы только предоставил геттер для массива и оставил бы его без него. Вы по-прежнему сможете назначать значения отдельным элементам в массиве, но это не позволит кому-либо выгружать весь массив из-под вас (или устанавливать его на null. Код будет выглядеть следующим образом:

class DemoClass
{
    public int[] MyNumbers
    { get; private set; }

    public DemoClass(int elements)
    {
        MyNumbers = new int[elements];
    }
}

Если число элементов не является фиксированным, тогда вам следует использовать List<int> вместо массива, и тогда вам определенно нужно свойство без установщика.

0 голосов
/ 11 августа 2011

Это называется Автоматически реализуемые свойства .Поэтому, если у вас есть синтаксис, такой как

public int[] MyNumbers { get; set; }

, компилятор C # автоматически создаст для вас вспомогательное поле.Эта функция была введена в C # 3.0, а до этого вам всегда приходилось реализовывать свойство с полем поддержки.

Подробнее об этом можно прочитать по адресу: Новые возможности языка C # "Orcas": автоматические свойства, инициализаторы объектов,и инициализаторы коллекции

0 голосов
/ 11 августа 2011
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};
    }
}
0 голосов
/ 11 августа 2011
 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.
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...