Нет, это не так. Я просто проверял со следующим классом:
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 создаст поле поддержки, и любой класс, который переопределяет свойство с помощью автоматической замены, создаст собственное поле поддержки на уровне этого класса.
Спасибо, декомпилированный код делает его очень ясным. Как вы это делаете с помощью Resharper? –
Просто, чтобы избежать путаницы - это код * resharper *, реконструированный с IL. Это ** не ** код, сгенерированный компилятором. Компилятор генерирует IL, а не C#. –
Извините, я не имел в виду Resharper - я имел в виду * Reflector * отсюда (http://www.red-gate.com/products/reflector/). Я отредактировал для уточнения –