C#3.0的自动属性是否完全取代了文件?
我的意思是,我可以直接使用该属性而不是归档作为属性作为私人支持字段。(对不起,我只是这样理解。)
int a;
public int A
{
get;set;
}
答案 0 :(得分:7)
是的,自动属性有自己的保留字段。
定义自动属性时,编译器将创建必要的后备字段。它不是常规代码中的字段,但它存在,如果您确实需要,可以通过反射访问它。
有关详细信息,请参阅本指南:http://msdn.microsoft.com/en-us/library/bb384054.aspx
答案 1 :(得分:7)
当您从代码访问该属性时 - 无论是在类的内部还是外部 - 它始终作为属性进行访问。在大多数情况下,这并不重要 - 但它 意味着您无法通过引用传递它,如果它是一个字段,您将能够做到。
直接访问支持字段的唯一代码(反射旁边)是属性本身。
这是一个纯粹而简单的财产。它不作为字段提供 - 它可作为属性提供。 C#编译器不用字段访问替换对它的访问。访问它始终是属性访问。当然,它可能由 JIT 编译器内联,但这没什么特别的。就CLR而言,它只是一个普通的属性(碰巧应用了[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不区分自动实现的属性和“正常”属性。
答案 2 :(得分:0)
涉及一些编译器魔法,例如代理,等等。您可以看到它好像编译器负责创建必要的代码,否则您必须明确键入。