自动属性是否完全替代了C#3.0的字段?
我是说,我可以直接使用属性而不是字段,因为属性作为私有后备字段。(抱歉,我只是这样理解)
我是说,我可以直接使用属性而不是字段,因为属性作为私有后备字段。(抱歉,我只是这样理解)
int a;
public int A
{
get;set;
}
int a;
public int A
{
get;set;
}
[CompilerGenerated]
属性)。public int Foo { get; set; }
被翻译成
private int <>Foo; // Or some other unspeakable name
public int Foo
{
get { return <>Foo; }
set { <>Foo = value; }
}
在C#代码中,您无法直接访问生成的字段,因为它具有无法言喻的名称。但是,如果使用反射检查类型,您将看到它存在-CLR不区分自动实现的属性和“常规”属性。
<>Foo
。C#编译器故意使用尖括号使名称“无法言说” - 即在C#中实际上无效,但对CLR来说是可以接受的。这意味着保证不会与“正常”的成员发生冲突,并且您将无法在代码中访问它。但确切的名称取决于具体实现 - 不要指望它被称为<>
后跟属性名称。(我甚至没有检查它是否现在做到了 - 但它会类似于此。) - Jon Skeet编译器会进行一些神奇的操作,例如委托等。你可以将其看作是编译器负责创建必要的代码,否则你需要显式地输入。