Будут ли сохранены значения const для каждого экземпляра? - PullRequest
1 голос
/ 11 февраля 2011

Для типа, подобного этому:

public class BlurEffect
{
    public const string Name = "Blur";

    public int Amount {get;set;}
}

У меня есть несколько членов, таких как .Name, которые будут одинаковыми для всех участников, я должен вместо этого сделать его статическим?

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

Наконец, мне нужен доступ к экземпляру, чтобы я мог сказать:

blurEffect.Name

Должен ли я создать свойство Name, которое возвращает закрытую статическую переменную? Это лучший способ?

Ответы [ 4 ]

4 голосов
/ 11 февраля 2011

Константы в C # фактически разрешаются во время компиляции. Они будут заменены значением везде, где оно используется компилятором, поэтому «переменная» (Name) фактически не будет существовать в полученном скомпилированном IL.

Строковые константы, кроме того, получают interned , поэтому в вашем исполняемом файле будет загружена только одна копия «Blur», независимо от того, сколько раз она использовалась.

Лично я бы использовал приватную константу и публичную переменную:

public class BlurEffect
{
    private const string name = "Blur";
    public string Name { get { return name; } }

    public int Amount {get;set;}
}

Это позволяет вам использовать данные на основе экземпляра, и при этом у вас есть единственная константа, которой вы можете манипулировать.

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

Константы в .NET довольно странные.Когда вы определяете константу, компилятор применяет объектно-ориентированные соглашения в исходном коде, но когда компилятор создает сборки, любая сборка, которая ссылается на эту константу, включая сборку, в которой вы ее объявили, получает замену ссылки на константусо ссылкой на то же значение, хранящееся в манифесте локальной сборки (в котором хранится большинство «литералов»).Таким образом, константы эффективно сохраняются для каждой сборки и являются «статическими» для каждого использования этой константы в сборке.Проблема в том, что если вы измените константу, вы должны перекомпилировать любую сборку, которая ссылается на константу, чтобы обновить манифесты в других сборках.

Лично в вашем случае я бы определил это значение как статическое и выставил его через свойство.Это предотвратит простое вложение значения и вместо этого поместит его в статическую копию объекта, на который будет ссылаться из одного места любая сборка в текущем домене приложения, которая нуждается в нем (что в основном означает, что оно одинаково везде в приложении,за исключением некоторых особых случаев, связанных с пулами приложений или поддоменами).

Дополнительная информация: Насколько постоянны ваши константы?

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

Лично я никогда не видел проблем с public const переменными.Однако следует учесть одну вещь: если вам позже потребуется преобразовать const в непостоянную (или вам придется выполнять какую-либо форму обработки, когда кто-то получает значение константы), тогда вы сломаете свой двоичный API.

Это означает, что если это входит в область действия библиотеки классов, то если вы сделаете такое изменение позже, то каждый проект, который ссылается на вашу библиотеку классов, должен быть перекомпилирован.Вы не можете просто зайти в DLL, чтобы сделать такое обновление.

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