Почему Array.Length и Array.Count () не могут быть присвоены константным значениям? - PullRequest
2 голосов
/ 10 августа 2010

Я хотел следовать превосходному совету C ++: один раз вычислить длину массива, а затем использовать значение, не вызывая функцию, подобную этой:

Вместо:

for( int i = 0; i < arr.length; ++i )

Iwrite

const int size = arr.length; // or arr.Count()
for( int i = 0; i < size; ++i )

После прочтения другого потока ( Дорого ли делать array.length или list.count в цикле ) Я заметил, что прирост производительности спорный, и этоC #, а не C ++.

Вторая причина для этого состояла в том, чтобы инициализировать мой массив значением:

const int size = arr.Length;

int[] primes_ = new int[size];

Поэтому мой вопрос таков:

Почему я все равно не могу это объявить?Мне плевать на ошибку:

Error 2 The expression being assigned to 'length' must be constant

Что очень сбивает с толку, потому что мое значение постоянное.Однако когда я удаляю const, poof отправляет сообщение.... Что?

Инициализация Length читает:

public int Length {get;} из MSDN.Что особенно сбивает с толку, потому что мой последний вопрос (функциональность Get-Set Accessor отличается наличием ключевого слова get-set) явно дал мне ответ: «Невозможно объявить только get и оставить set отсутствующим».

Мне не понятно, почему я могу объявить int size = arr.Length, но не const int size = arr.Length.Почему это так?

Ответы [ 2 ]

7 голосов
/ 10 августа 2010

Ключевое слово const требует, чтобы значение было известно во время компиляции - компилятор .Net не может определить значение arr.length при компиляции кода, поэтому вы не можете присвоить его const.

Что касается вашего последнего вопроса о методах получения и установки - вы должны объявить оба значения только , если используете синтаксис сокращения: то есть private long n { get; private set; }. Если вы используете полное подробное объявление свойства с локальным полем, вы можете объявить просто get:

private long _n = 0;
private long N { get { return _n; } }
4 голосов
/ 10 августа 2010

Определение с const в C # требует инициализатора, который может быть оценен во время компиляции.

Смотрите здесь.

Вы можете использовать readonly

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...