3

C# 3.0 的自动属性是否完全取代了归档?

我的意思是,我可以直接使用该属性而不是归档作为私有支持字段的属性。(对不起,我只是这样理解)。

int a;

public int A
{
  get;set;
 }
4

3 回答 3

7

是的,自动属性有自己的持有字段。

当您定义一个自动属性时,编译器将创建必要的支持字段。它不能作为常规代码中的字段使用,但它就在那里,如果你真的需要它,你可以通过反射访问它。

请参阅本指南了解更多信息:http: //msdn.microsoft.com/en-us/library/bb384054.aspx

于 2009-11-14T19:09:09.607 回答
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 不区分自动实现的属性和“正常”属性。

于 2009-11-14T19:18:53.330 回答
0

涉及到一些编译器魔法,例如委托等。您可以将其视为编译器负责创建必要的代码,否则您将不得不显式输入。

于 2009-11-14T19:19:40.710 回答