与自动属性相关的封装
本文关键字:封装 属性 | 更新日期: 2023-09-27 18:27:59
请看一下客户类的这个简单实现:
class Customer
{
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerID { get; set; }
public Customer(double purchases, string name, int ID)
{
TotalPurchases = purchases;
Name = name;
CustomerID = ID;
}
}
我注意到客户名称有一个获取和设置选项。假设我需要更改客户名称。
通过这样的方法更改客户名称更容易接受吗:
public void changeName(string name)
{
this.Name = name;
}
Customer cus = new Customer(5,"John",5005);
cus.changeName("Jim");
或者仅仅通过做来改变它是可以接受的吗
cus.Name = "Jim";
没有必要使用方法来更改属性。存在属性的原因是允许您围绕字段的访问实现额外的逻辑。本质上,属性创建一个私有字段并自动生成访问器/赋值器方法。
类似public string Foo { get; set; }
的属性相当于
private string foo;
public string Foo
{
get
{
return foo;
}
set
{
foo = value;
}
}
因此,例如,您可以实现额外的逻辑:
private string foo;
public string Foo
{
get
{
return foo.Trim();
}
set
{
if (value == "bar")
{
throw new Exception("validation");
}
foo = value;
}
}
如果设置Name属性更改状态或执行您认为对客户类用户不透明的操作,请使用方法方法。对其他一切都使用属性方法。
您显然有Java背景(正如我所做的:-)。在C#中,cus.Name = "Jim" ;
是绝对有效的。原因是,看起来像赋值的实际上是一个"setter"函数调用。这个函数可以用你想要的任何代码重新定义,但调用它的语法仍然是cus.Name = "Jim" ;
。
这被称为引用一致性,它是一个真正微不足道的Java不支持它。