【发布时间】:2017-07-12 12:23:24
【问题描述】:
当使用抽象的 getter-only 自动属性然后被表达式主体属性覆盖时,Roslyn 编译器是否仍然创建使用支持字段?
据我了解,编译器将为自动属性创建一个支持字段,但不会为表达式主体属性创建一个支持字段。
基础抽象类
public abstract class FooPage
{
protected abstract string PageName { get; }
}
派生类
public class BarPage : FooPage
{
protected override string PageName => "FooBar";
}
我想知道在这种情况下会发生什么。我在 Roslyn 的 wiki 中找到了这个。 https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#expression-bodies-on-property-like-function-members
但仍不确定幕后实际发生了什么。
【问题讨论】:
-
如果你对这类事情很感兴趣,最快的解决方法是实际编译代码,然后使用
ildasm或ILSpy之类的工具(在IL模式下)查看生成的代码。显然,这个结果不能概括为对编译器应该做什么或必须做什么做出明确的陈述(只能由标准来回答),但是对于“我想知道如何”的问题通常就足够了。 -
FooPage没有声明自动属性——它声明了一个抽象属性。语法相同,但语义不同。如果您将属性设为virtual,那么您将获得一个自动属性(带有支持字段)。当您知道这一点,并且表达式主体属性不使用支持字段,以及如何单独编译FooPage和BarPage时,您应该能够自己推理出编译器必须(几乎必须)如何实现这个。 -
感谢@JeroenMostert。
-
@JeroenMostert 为什么不将其发布为答案?
-
@svick:因为我是一个懒惰、懒散的可怜虫,经常需要一些明确的鼓励来发布答案,而不是即兴发挥……但现在已经解决了。