关于c#:public int i和public int i之间有什么区别{get;


What is the difference between public int i and public int i {get; set;} (what is the difference between automatic property and a public member?)

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
c#: why have empty get set properties instead of using a public member variable?
C#: Public Fields versus Automatic Properties

我在代码中使用"自动"属性,我想知道两者的实际区别是什么此代码:

1
2
3
public class foo{
    public int i;
}

1
2
3
public class foo{
    public int i {get; set;}
}

我知道有区别,因为我使用的第三方错过了公共成员,但在添加{get; set;}后发现了他们。

因为在那后面没有私人的场地,那场戏的背后是什么?


当使用自动属性时,编译器会生成一个私有字段。

When you declare a property as shown in the following example, the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors.

关于这两个示例之间的差异,第一个示例直接公开字段以进行操作。这被认为是不好的做法(认为信息隐藏、封装丢失)。

在第二个示例中,您必须使用getter和setter,并且可以围绕这些操作添加任何类型的验证和其他逻辑。

查看此日志:

If I have a field with no special behavior, should I write a"just in case" property (with trivial get/set), or should I expose a public field?

The reason that the library design guidelines suggest you write a property here is that it is important that libraries be easily versioned. If you put a property in there ahead of time, you can change the property implementation without requiring users to recompile their code.


第一个是一个字段,可以描述为pod。第二个是一个属性,允许派生类重载和隐藏,而第一个不是。第二个是一个很好的,因为编译器会悄悄地创建一个后备存储器。


这是自动属性,不是匿名属性。实际上,它有一个私有的支持字段,它只是由编译器自动生成的,在编译时不可用。如果您通过类似于Reflector的东西运行您的类(或者在运行时使用Reflection检查它),您将看到支持字段。

回答你的问题"有什么区别?"显而易见的答案是,一个是字段,而另一个是属性。使用自动属性的好处是,如果需要,它可以让您在以后灵活地移动到传统属性,而无需更改API。对于第三方代码能够"到达"一个而不是另一个,这是另一个开发人员最好回答的问题。也就是说,大多数API设计用于处理属性,而不是字段(因为传统的观点是您不公开声明类之外的字段)。如果第三方库反射性地扫描您的类,那么它可能只查找属性。

重要的是要记住:

1
2
3
4
5
6
7
private string backingField;

public string Data
{
    get { return backingField; }
    set { backingField = value; }
}

1
public string Data { get; set; }

编译为基本相同的代码。唯一实质性的区别是支持字段的名称。