假设_property只由Property的setter设置,这是否是 代码冗余?
确切地说,它是多余的。这是Properties的实际目的。我们不应该直接访问类的字段。我们应该使用Property来访问它们。所以在相应的setter中,我们可以嵌入任何逻辑,我们可以保证每次我们尝试设置一个值时,这个逻辑都会再次被验证。这个论证甚至适用于一个类的方法。在一个方法中,我们必须使用属性而不是实际的字段。而且,当我们想要读取一个字段的值时,我们应该使用相应的getter。
通常,属性增强了封装的概念,封装是面向对象编程OOP的支柱之一。
很多时候,当我们想要设置一个值时,没有任何逻辑应该应用。举例如下例:
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
我们已经声明了一个代表客户的类。客户对象应具有三个属性Id
,FirstName
和LastName
。
一个直接的问题,当有人读这个类时,为什么有人应该使用这里的属性?
答案也是一样的,它们提供了封装机制。但是让我们考虑一下,从长远来看,这对我们有什么帮助。比方说,有一天,有人决定一个客户的名字应该是长度小于20的字符串,如果上面的类被声明如下:
public class Customer
{
public int Id;
public string FirstName;
public string LastName;
}
那么我们就应该检查的FirstName
长度在我们创建的每个实例中!否则,如果我们有所回升与性能的声明,我们可以很容易地只利用Data Annotations
public class Customer
{
public int Id { get; set; }
[StringLength(20)]
public string FirstName { get; set; }
public string LastName { get; set; }
}
,就是这样。另一种方法可能是以下几点:
public class Customer
{
public int Id { get; set; }
private string firstName;
public string FirstName
{
get { return firstName }
set
{
if(value!=null && value.length<20)
{
firstName = value;
}
else
{
throw new ArgumentException("The first name must have at maxium 20 characters", "value");
}
}
}
public string LastName { get; set; }
}
具有重温所有你的代码,使该检查考虑上述两种方法的。物业赢得的结果很清楚。
宇宙射线和硬件错误总是会导致该值为空。当我看到像这样的东西时,我把它归因于“小心谨慎”。内部字段可能有很多种方式(例如输入的序列化),但是大多数方法都是非常特殊的,并且应该从上下文中清楚。 –