Свойства постоянного значения - PullRequest
1 голос
/ 15 февраля 2012

Будут ли оцениваться не виртуальные свойства постоянных значений во время компиляции? (Как и сами константы)

Пример:

class Clazz
{
    const int SPEED = 5;

    public int Speed 
    {
    get { return SPEED; }
    }
}

Я знаю, что любой вызов константы SPEED будет оцениваться один раз во время компиляции, но если я получу доступ к свойству Clazz.Speed из любого места в моей программе, это также будет оценено как время компиляции ?

Редактировать: Чтобы немного развить вопрос, будут ли следующие два примера встроены компилятором (а не JIT)? [То есть. оценивается во время компиляции]:

// a static / non-static method that returns a constant value
(static) int GetConstant() { return 42; }

// a static / non-static property that returns a constant value
(static) int ConstProperty { get { return 42; } }

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

Запуск этого через Linqpad производит следующий IL для геттера:

Clazz.get_Speed:
IL_0000:  ldc.i4.5  //push integer value 5 on evaluation stack   
IL_0001:  ret 

Это будет означать, что геттер вызывается во время выполнения (и не встроен) и возвращает постоянное значение.

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

2 голосов
/ 15 февраля 2012

Нет, он не будет оцениваться во время компиляции, но может быть встроен во время выполнения.

1 голос
/ 15 февраля 2012

Нет, свойство не будет оцениваться во время компиляции.

На самом деле это единственное преимущество использования недвижимости.

Возьмите ваш код, например:

class Clazz
{
    public const int SPEED = 5;

    public int Speed 
    {
    get { return SPEED; }
    }
}

Если вы используете Clazz.SPEED в другой сборке, которая будет оценена во время компиляции. вам нужно развернуть 2 сборки, если вы измените значение SPEED.

Если вы используете Clazz.Speed, вам нужно только развернуть одну сборку, в которой находится Clazz.

Альтернативой является использование статической переменной-члена только для чтения. но рекомендуется свойство, которое можно расширять.

Пожалуйста, прочитайте первые 2 пункта книги: Эффективное C #: 50 конкретных способов улучшить ваш C #
Item1: всегда использовать свойства вместо доступных членов данных
Item2: предпочтение только для чтения const

...