我认为它是在.net 2.0中,微软推出了一个缩写为
的访问器 public string Name { get; set; }
但上述代码之间是否有任何真正的区别,只是:
public string Name;
答案 0 :(得分:6)
主要区别在于,如果您以后需要在getter或setter中添加逻辑,而其他DLL已经针对您的编译,则可以轻松更改
public string Name { get; set; }
到
public string Name { get{/*special code*/} set{/*special code*/} }
并且发布新DLL并且不会重新编译其他DLL也不会发生重大变化。
然而,如果你改变了
public string Name;
进入
public string Name { get{/*special code*/} set{/*special code*/} }
然后你需要确保重新编译任何使用你的DLL,因为它们从访问字段变为访问属性。
当您将DLL运送给其他程序员(例如开源项目或作为组件供应商)时,这显然是一个更大的问题,而不是您只为自己/雇主构建应用程序
答案 1 :(得分:4)
区别在于 Field 和 Property 。字段只是类实例上的成员变量。相比之下,属性是两个单独操作的简写 - 获取和设置:
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
private string _name;
这是一个过于简化的示例,因为该属性只是通过在getter中返回并将其设置在setter中来“包装”私有字段。但是,当属性成为潜在价值的“门户”时,属性变得非常有用。如果程序流需要在每次设置字段的值时发生某些事情(例如,触发事件),则可以从属性的setter触发它:
set
{
this.InvokePropertyChangedEvent();
_name = value;
}
您要问的确切语法称为 Auto-Implemented Properties ,这只是我上面提供的简单示例的简写。编译器创建一个由属性获取和设置的私有成员。
答案 2 :(得分:4)
自动属性最初是在C#3.0中引入的。区别:
public string Name { get; set; }
和
public string Name;
是第一个声明property而第二声明field。在OOP中,属性用于封装字段。属性可以包含setter
或getter
或两者,您还可以为每个属性指定不同的辅助功能级别。
答案 3 :(得分:2)
速记属性声明之间的区别在于您可以通过这种方式定义它。
public string Name { get; private set; }
这意味着可以公开阅读财产,但只有私人会员可以写入。你不能为一个领域做这样的事情。
如果你看一下生成的IL 简短的财产声明,你 会发现编译器已添加 / autogenerated member-fields to a 财产将读取或写入。
答案 4 :(得分:2)
就编写代码获取值或存储它而言,没有任何功能差异。但是在某些情况下,调用者可能会期望某个字段或属性,并且只能通过使用反射接受其中一个或另一个。例如,WPF可能只绑定到属性而不绑定到字段。
答案 5 :(得分:1)
是的,第二行中的代码直接提供给内存中的成员,而在第一行中,您有一个间接级别,您可以在将来添加一些逻辑来验证和延迟分配。
此外,如果使用反射,则必须为第一个示例行查找Property Setter和Getter,而对于第二个示例行,您需要直接检索成员变量。
通常,使用Properties是一个更好的设计。
答案 6 :(得分:0)
我为propertygrid用户找到的一个有用的区别是使用 public string Name {get;组; } 我们可以轻松地在Propertygrid中设置源数据。
同时宣布 公共字符串名称; 不会对Propertygrid使用。