我对 C# 中的自动属性有些困惑,例如:
public string Forename{ get; set; }
我理解你通过不声明私有变量来节省代码,但是如果你没有使用任何 get 或 set 逻辑,那么属性的意义是什么呢?为什么不直接使用
public string Forename;
我不确定这两个语句的区别在哪里,我一直认为如果你想要额外的get/set逻辑,你会使用属性(properties)?
我对 C# 中的自动属性有些困惑,例如:
public string Forename{ get; set; }
我理解你通过不声明私有变量来节省代码,但是如果你没有使用任何 get 或 set 逻辑,那么属性的意义是什么呢?为什么不直接使用
public string Forename;
我不确定这两个语句的区别在哪里,我一直认为如果你想要额外的get/set逻辑,你会使用属性(properties)?
属性可以在不违反契约的情况下放置代码,而字段则无法放置代码,除非将其更改为属性(并破坏接口)。属性可以是只读或只写的,而字段不能。属性可以进行数据绑定,而字段则不能。
public string Forename{ get; private set; }
要获取只读属性... 这仍然不如真正的属性灵活,但对于有些情况来说是一个妥协。
我不确定这两个语句之间的区别,我一直以为如果想要额外的get/set逻辑就使用属性呢?
在第一种情况下,编译器将自动为您添加一个字段,并包装属性。这基本上相当于执行以下操作:
private string forename;
public string Forename
{
get
{
return this.forename;
}
set
{
this.forename = value;
}
}
使用属性(properties)比使用字段(fields)有许多优点。即使您不需要一些特定的原因,比如数据绑定,这也可以帮助未来证明您的API(应用程序编程接口)。
主要问题在于,如果您创建了一个字段,但在应用程序的v2中需要属性时,则会破坏API。通过最初使用自动属性,您有可能随时更改API,而无需担心源代码或二进制兼容性问题。
这意味着您希望稍后添加逻辑。
如果您从一开始就将其作为属性添加,您将不必重建相关代码。如果您将其从变量更改为属性,则必须重新构建相关代码。
公共数据成员有害(因为对象无法控制其自身状态的修改 - 它变成了全局变量)。破坏了封装 - 面向对象编程的原则。
自动属性存在是为了提供封装,并避免为简单属性编写样板代码的繁琐。
public string ID { get; set;}
string m_ID;
public string ID
{
get { return m_ID; }
set
{
//validate value conforms to a certain pattern via a regex match
m_ID = value;
}
}
当添加自动属性时,编译器将在应用程序中添加get set逻辑,这意味着如果您稍后添加到此逻辑,并且外部库引用您的属性,仍将起作用。
如果您从公共变量迁移到属性,则对于引用您的其他库来说,这将是一种破坏性的变化 - 因此,为什么不从自动属性开始呢? :)
并非所有属性都需要get/set逻辑。如果需要,可以使用私有变量。 例如,在MV-something模式中,您的模型不会有太多逻辑。但是您可以根据需要混合和匹配。
如果您要使用像您建议的字段来替换属性,则无法定义接口以正确描述您的类,因为接口不能包含数据字段。