2009-12-09 2 views
5

Простой вопрос: позволяет ли абстрактное свойство создать частное поле поддержки? Пример:Создает ли абстрактное свойство собственное поле поддержки?

public abstract Name { get; set; } 

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

ответ

7

Нет, это не так. Я просто проверял со следующим классом:

public abstract class Class1 
{ 
    public abstract string TestStringAbstract { get; set; } 

    public string TestString { get; set; } 
} 

и декомпилирован его в Reflector. Это сгенерированный код:

public abstract class Class1 
{ 
    // Fields 
    [CompilerGenerated] 
    private string <TestString>k__BackingField; 

    // Methods 
    protected Class1() 
    { 
    } 

    // Properties 
    public string TestString 
    { 
     [CompilerGenerated] 
     get 
     { 
      return this.<TestString>k__BackingField; 
     } 
     [CompilerGenerated] 
     set 
     { 
      this.<TestString>k__BackingField = value; 
     } 
    } 

    public abstract string TestStringAbstract { get; set; } 
} 

Как вы можете видеть только одно поле подложки был сгенерирован для конкретного имущества. Абстрактная была оставлена ​​как определение.

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

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

+0

Спасибо, декомпилированный код делает его очень ясным. Как вы это делаете с помощью Resharper? –

+0

Просто, чтобы избежать путаницы - это код * resharper *, реконструированный с IL. Это ** не ** код, сгенерированный компилятором. Компилятор генерирует IL, а не C#. –

+0

Извините, я не имел в виду Resharper - я имел в виду * Reflector * отсюда (http://www.red-gate.com/products/reflector/). Я отредактировал для уточнения –

5

Нет. Поскольку он является абстрактным, разработчик класса должен реализовать свойство. Если разработчик объявляет его таким образом, то Да, это автоматическое свойство со скрытым элементом для хранения фактического значения.

3

Там разница между:

public abstract string Name { get; set; } 

и

public string Name { get; set; } 

Первая декларация собственности не создает поле подложки. Он просто создает абстрактное свойство (вроде как объявление метода интерфейса), которое должно быть реализовано любым не абстрактным наследующим классом.

Вторая декларация - это свойство auto-property, которое создает резервное поле. Это на самом деле синтаксический сокращенный текст компилятора для:

private string _name; 
public string Name { get { return _name; } set { _name = value; } }