2012-02-15 4 views
0

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

Пример:

class Clazz 
{ 
    const int SPEED = 5; 

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

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

Edit: Чтобы evlove постановка вопроса немного, будут ли следующие два примера быть встраиваемыми в Compiler (а не 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; } } 
+1

Что вы пытаетесь достичь? Какая у вас проблема, что это имеет значение? –

+0

@ M.Babcock, честно говоря, нет никакой конкретной проблемы, что этот адрес, просто мысль, которая пришла ко мне. Я был удивлен, когда я не мог легко найти ответ на это в Интернете. – Acidic

+0

Это, вероятно, лучше подходит для формата http://programmers.stackexchange.com. Теоретически *, что происходит в компиляторе и почему вопросы типа * немного выходят за рамки SO. –

ответ

2

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

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

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

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

1

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

+0

что мешает * компилятору * встраивать не виртуальные методы, возвращающие постоянные значения? – Acidic

+1

@Acidic, если он находится в другой сборке, тогда вы можете переключить его без повторной компиляции, и поведение должно измениться. – svick

+0

@svick Есть ли способ заставить компилятор встроить это? – Acidic

1

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

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

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

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: Всегда использовать свойства Вместо доступных членов данных
Элемент2: Предпочитают чтения на константные