2012-03-10 23 views
11

我知道使用自动属性时,编译器会在屏幕后面创建自己的后台字段。然而,在许多程序中,我读了,我看到人们学会明确写入有或没​​有后场的自动属性 ​​- 偏好?

private int _backingField; 

public int Property { get { return _backingField; } } 

是什么区别上方与下方?

public int Property { get; private set; } 

我的理解是其明显的使用属性,当你确实有在getter或setter的副作用,但是这往往并非如此。另外,我知道你必须在结构的情况下明确地使用后台字段,你不能通过属性访问他们的成员。

我一直能找到的唯一区别是调用该值的方式在它定义的类内部是不同的。它是简单的首选项,还是有更多通过其属性调用值或通过直接访问该字段? 简单的约定?

回答

14

这两个片段之间没有太大区别 - 例如,您不能通过引用传递属性,但这很少是问题。但是,如果您希望字段是只读的,就像这样:

private readonly int _backingField;  
public int Property { get { return _backingField; } } 

然后有区别。我上面编写的代码可以防止在类中的其他位置更改值,从而清楚地表明这实际上是不可改变的。我真的希望能够声明一个只读字段,只读自动实现属性,只能在构造函数中设置 - 但目前不可用。

这是相当混乱,顺便说一句:

而且,据我所知,你必须明确地使用结构的情况下,支持字段,则无法通过属性访问他们的成员。

你是什么意思?你可以肯定地使用结构中的属性。你说的是备份领域,其可变的结构,即区别:

foo.someField.X = 10; 

foo.SomeProperty.X = 10; 

?如果是这样的话,我通常会避免这个问题,通过使我的结构不可变,从一开始:)

+1

以XNA的Vector2为例,如果我说 public Vector2 TheVector {get;组; } 我不能打电话 TheVector.X = 10; 相反,我必须使用实际的字段。关于通过价值/参考的事情。 (你有一些阅读材料,澄清通过值/参考C#,作为旁注?) – Taelia 2012-03-10 11:18:55

+0

另外,如果我的两个例子之间真的没有区别,为什么这么多人仍然明确地创建一个后场(没有真正的目的)? – Taelia 2012-03-10 11:22:10

+0

@Taelia:对,这就是我可以避免的可变结构。这是因为该属性返回值的一个副本。而且我不会试图说出其他人做什么的理由。 – 2012-03-10 11:24:05

相关问题