C#3.0中自动属性和公共字段之间的区别

时间:2009-08-01 16:32:47

标签: c# c#-3.0

我无法理解为什么C#3.0中存在自动实现的属性语言功能。

当你说

时它有什么不同
public string FirstName;

大于

public string FirstName { get; set; }

7 个答案:

答案 0 :(得分:20)

因为它们在生成的IL代码(和机器语言)中的实现方式不同。自动属性仍然作为公共getter和setter公开,而公共字段就是 - 单个字段..

因此,实现auto属性允许您稍后更改getter或setter的内部行为(如添加验证程序),而无需重新编译或重新编码任何使用它的依赖类...

答案 1 :(得分:9)

只是为了添加其他人所说的,声明一个公共字段,该字段可以读取和写入。声明公共自动属性,虽然该属性是公共的,但您仍然可以添加修饰符来控制get / set级别的可访问性。

public string FirstName { get; private set; }

您班级的用户将FirstName视为公共属性。但是,他/她不能写信。

答案 2 :(得分:6)

如果您以后想要将每个属性更改为具有自定义实现的属性,请考虑会发生什么。如果它是自动实现的属性,您只需添加一个字段并更改实现。完整的源代码和二进制兼容性。

如果它是一个开头的字段,则既没有源也没有二进制兼容性。您必须重建引用它的所有内容,并修复不再编译的任何内容。

此外,properties have various benefits over fields。我对字段的主要个人反对意见是它在API中公开了实现决定。

答案 3 :(得分:2)

不同之处在于,使用代码读取属性编译的其他程序集是针对属性编译的。

如果您稍后决定需要向getter或setter添加代码,则可以执行此操作,而不必强制链接到它的所有其他程序集重新编译。

字段不是这样。如果您稍后将字段更改为属性,则为了添加该代码,与您相关联的其他程序集将停止正常运行,因为它们被编译为读取字段而不是属性。

此外,编写了大量代码来查找属性,而不是字段,如数据绑定等。

答案 4 :(得分:2)

因为这个用途:
public string FirstName { get; private set; }
容易的财产,由OO规则'kosher'

答案 5 :(得分:0)

第一个是公共领域,第二个是公共财产。

主要区别在于它们的使用方式。例如,WPF只能将数据绑定到属性,而不是字段。

答案 6 :(得分:0)

自动属性是编译器生成的常规属性,它们使用支持字段,如任何常规属性,但您不需要为此编写代码。以下是编译器生成的代码的一个非常具有说明性的示例(感谢Reflector):

[CompilerGenerated]
private string <ContentType>k__BackingField;

public string ContentType
{
    [CompilerGenerated]
    get
    {
        return this.<ContentType>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<ContentType>k__BackingField = value;
    }
}