2010-11-12 5 views
3

структуре Можно ли иметь постоянный поплавок в моей структуреплавать [] в

private struct MyStruct 
{ 
    public const float[] TEST = new float[] {1,2}; 
} 

Предшествующая были моей первой догадка, но не работает.

Любые идеи?

+3

Non нулевые массивы не могут быть '' const' так null' является единственным compiletime константа этого типа. Вам нужно «статично читать только». Но это не дает вам глубокой неизменности. Поэтому, возможно, оберните его в 'ReadOnlyCollection ' – CodesInChaos

ответ

1

Нет, вы не можете иметь константный поплавок []

Чаще всего обрабатываются с некоторыми varient из

public static readonly float[] TEST = new float[] {1,2}; 

Но этот массив не является сам по себе неизменны, таким образом, вы часто идут вдоль линий

public static readonly IList<float> TEST = new ReadOnlyCollectioN(new float[] {1,2}); 

Наконец, последний вариант состоит в том, чтобы создать ваше собственное неизменяемое представление float [], которое может быть создано и выполнить те же действия, что и float [], без изменения.

+0

что вы имеете в виду неизменяемость и это важно? – Rod

+1

@rod - Я имею в виду, что базовый набор значений, которые были представлены float [], не может быть изменен; поэтому я не могу изменить TEST [0] = некоторое новое значение. Это распространяется на Array.AsReadOnly, упомянутый выше, или новый ReadOnlyCollection, упомянутый здесь. В самом основном смысле, неизменяемые средства, когда-то построенные, внутреннее состояние объекта не изменится. –

+0

Получил благодарность за понимание. Я определенно не хочу, чтобы значение менялось. – Rod

4

Нет, но вы можете сделать это:

private struct MyStruct 
{ 
    public static readonly IList<float> TEST = Array.AsReadOnly(new float[] {1,2}); 
} 

Не используя Array.AsReadOnly означает, что люди не могли сделать TEST точку в другой массив, но массив вы назначили могли бы его содержимое изменилось.

+0

+1 Array.AsReadOnly немного чище; хотя, если заменить const, я могу сделать static? (если const не предназначался для определения неизменяемости) –

+0

Да, конечно, я хотел включить 'static'. :) Интерфейс с клавиатурой не очень хорошо работает сегодня. – cdhowie

0

Постоянные Инициализаторы должны быть во время компиляции константы

new float[] {1,2} 

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

public static readonly float[] TEST = new... 
+0

float [] по-прежнему изменен и не постоянен, должен убедиться, что ReadOnly в противном случае не является константой. –

+0

, строго говоря, делая его экземпляром ReadOnlyCollection, он не делает его const - он просто ограничивает поведение, которое может быть выполнено на нем. – matt

+0

Это не делает массив const в смысле «значения заменены во время компиляции», но это делает массив const в смысле «его содержимое не может быть изменено» (за исключением любых глупых отражений, курс...). – cdhowie

Смежные вопросы