C# public int i和public int i{get;set;}之间有什么区别(自动属性和公共成员之间有什么区别?)

C# public int i和public int i{get;set;}之间有什么区别(自动属性和公共成员之间有什么区别?),c#,C#,可能的重复项: 我在代码中使用“自动”属性, 我想知道两者之间的实际区别是什么 此代码: public class foo{ public int i; } 及 我知道这是有区别的,因为我使用的第三方错过了公共成员,但在添加{get;set;}后发现了他们 因为后面没有私有字段,所以后面是什么?编译器在使用时会生成一个私有字段 如以下示例所示声明属性时,编译器将创建一个只能通过属性的get和set访问器访问的私有匿名支持字段 关于这两个例子之间的区别,第一个例子直接暴露场进行操作

可能的重复项:

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

public class foo{
    public int i;
}

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


因为后面没有私有字段,所以后面是什么?

编译器在使用时会生成一个私有字段

如以下示例所示声明属性时,编译器将创建一个只能通过属性的get和set访问器访问的私有匿名支持字段


关于这两个例子之间的区别,第一个例子直接暴露场进行操作。这被认为是不好的做法(比如信息隐藏、封装丢失)

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

见博客帖子:

如果我有一个没有特殊行为的字段,我应该写一个“以防万一”属性(使用普通的get/set),还是应该公开一个公共字段

库设计指南建议您在此处编写属性的原因是,库的版本控制非常重要。如果提前将属性放入其中,则可以更改属性实现,而无需用户重新编译其代码

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

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

重要的是要记住:

private string backingField;

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


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

第一个是字段,可以描述为POD。第二个是属性,允许派生类重载和阴影,而第一个不重载和阴影。第二个也是很好的,因为编译器会默默地创建一个备份存储

我知道。但是,财产与公共领域之间的区别是什么?为什么有些代码可以以相同的名称到达一个属性而不是一个公共字段?“丹尼-正如你评论的那样回答:”下注者-关心评论?“ODD -我能把财产看作是一个函数吗?关于引擎盖下面发生了什么?”达尼——你可以这样对待他们,虽然它们没有参数。我在评论中的问题中找到了一些答案,但我仍然不明白在一个属性和一个字段之间的掩护下会发生什么。属性是函数吗?不是功能?
private string backingField;

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