Как я могу создать публичный размер констант в C #? - PullRequest
3 голосов
/ 22 февраля 2011

Я пытаюсь написать следующий код:

public const Size ImageSize = new Size() { Width = 28, Height = 28 };

Но я получаю ошибку, что Width и Height только для чтения.

Каков рекомендуемый способсделать это?

Ответы [ 7 ]

10 голосов
/ 22 февраля 2011

Основная проблема заключается в том, что вы не можете объявить объект типа System.Drawing.Size как const.Это означает, что символ должен быть заменен во время компиляции значением константы.

Вместо этого вы должны использовать readonly.Это также «постоянное» значение в том смысле, что его нельзя изменить после запуска конструктора, но объекты создаются во время выполнения, а не во время компиляции.

Следующий код компилируется просто отлично:

public static readonly Size ImageSize = new Size() { Width = 28, Height = 28 };
8 голосов
/ 22 февраля 2011

const ограничен примитивами, которые компилятор может напрямую записать как IL.readonly здесь должно быть достаточно , если Size рассматривается как неизменный, то есть

public static readonly Size ImageSize = new Size(28,28);

Обратите внимание, что если Size является изменяемым struct, могут произойти плохие вещи;Я бы порекомендовал свойство, а не поле, чтобы избежать ряда запутанных побочных эффектов.

2 голосов
/ 22 февраля 2011
public static readonly Size ImageSize = new Size(28,28);
1 голос
/ 22 февраля 2011

код, который вы пишете:

public const Size ImageSize = new Size() { Width = 28, Height = 28 };

На самом деле компилируется так же, как это:

public const Size ImageSize = new Size();
ImageSize.Width = 28;
ImageSize.Height = 28;

Версия, которую вы используете, называемая инициализатором объекта, является всего лишь синтаксическим сокращением для последней версии выше. Два логически идентичны. В последней версии вы можете увидеть, почему она выдает ошибку, вы не можете установить свойства для const после того, как оно было объявлено.

Более того, я не уверен, что вы можете использовать такой тип ссылки как const. Я не уверен в этом, так как не могу сказать, что когда-либо пробовал. Вместо этого вы можете попробовать readonly. Хотя вы можете столкнуться с той же или похожей проблемой.

Имеет ли Size конструктор, который можно вызывать с параметрами вместо использования инициализатора объекта?

1 голос
/ 22 февраля 2011

Вместо этого вы должны сделать это:

public readonly Size ImageSize = new Size(28, 28);

Создание экземпляра только для чтения, чтобы предотвратить его изменение, поскольку вы не можете создать размер как константу.

Из документов:

Постоянное выражение - это выражение, которое может быть полностью оценено во время компиляции.Поэтому единственными возможными значениями констант ссылочных типов являются строковые и нулевые значения.

0 голосов
/ 22 февраля 2011

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

public static readonly Size ImageSize = new Size(28, 28);

На самом деле это не const, но он не будет изменен после инициализации.

0 голосов
/ 22 февраля 2011

Вам нужно использовать конструктор, который принимает ширину и высоту в качестве параметров.Кроме того, выражение должно быть полностью вычисляемым во время компиляции.Это может не работать с вашим типом Size (не знаю, какой это).Если это так (например, с System.Drawing.Size), вы можете рассмотреть возможность использования readonly вместо const.

...