C#自动属性

3
自动属性是否完全替代了C#3.0的字段?
我是说,我可以直接使用属性而不是字段,因为属性作为私有后备字段。(抱歉,我只是这样理解)
int a;

public int A
{
  get;set;
 }

请保留您的答案,不要删除它。 - user196546
2
在未来,请不要只选择你看到的第一个正确答案。当新手这样做时,对我们许多人来说是令人沮丧的,因为它倾向于鼓励快速回答并阻碍可能需要更长时间打字但更好的答案,这违背了StackOverflow的主要目的。 - Ray Burns
@ RayBurns。抱歉,我以后会避免这种情况。再次道歉。 - user196546
3个回答

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不区分自动实现的属性和“常规”属性。


你的意思是当使用属性时,如果A是一个属性,我就不能做(ref A)了,对吗? - user196546
请看我的评论。"now" 应该是 "not"(否则关于反射的那一段就有点多余了)。 - Brian Rasmussen
通常我看到的是Foo<int>这种表示法...但是private int<> Foo是什么意思呢?我的意思是int后面的尖括号(即)int<>和<>Foo..? - user196546
这是字段的名称:<>Foo。C#编译器故意使用尖括号使名称“无法言说” - 即在C#中实际上无效,但对CLR来说是可以接受的。这意味着保证不会与“正常”的成员发生冲突,并且您将无法在代码中访问它。但确切的名称取决于具体实现 - 不要指望它被称为<>后跟属性名称。(我甚至没有检查它是否现在做到了 - 但它会类似于此。) - Jon Skeet

7
是的,自动属性有自己的持有字段。
当您定义自动属性时,编译器将创建必要的后备字段。它在常规代码中不可用作为字段,但是如果您确实需要它,可以通过反射访问它。
请参阅此指南以获取更多信息:http://msdn.microsoft.com/en-us/library/bb384054.aspx

抱歉,Nescio已经先回答了,所以我选择了他的答案。 - user196546
没问题。你可以选择你喜欢的答案。 - Brian Rasmussen
我不同意它“现在可用作字段”的说法 - 这会暗示你可以通过引用传递它。它是一个属性,有自己的私有支持字段,其他任何东西都无法访问。 - Jon Skeet
@Jon,你说得对。笨拙的打字错误。我本意是想说“不可用”。谢谢。 - Brian Rasmussen
1
啊,这样就清楚多了 :) - Jon Skeet

0

编译器会进行一些神奇的操作,例如委托等。你可以将其看作是编译器负责创建必要的代码,否则你需要显式地输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接