2013-08-17 45 views
0

请看看这个简单的实现客户类:封装有关自动属性

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; 
    } 
} 

我注意到,有一个get和客户名称设置选项。假设我需要更改客户名称。

是不是更容易接受像这样通过的方法改变客户名称:

public void changeName(string name) 
{ 
    this.Name = name; 
} 
Customer cus = new Customer(5,"John",5005); 
cus.changeName("Jim"); 

还是可以接受的只是在做改变它:

cus.Name = "Jim"; 

回答

1

有一个方法来改变财产是不必要的。属性存在的原因是为了允许您实现有关字段访问的其他逻辑。本质上,该属性创建一个私有字段并自动生成访问器/增变器方法。

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; 
    } 
} 
0

你显然有一个Java的背景(我做太多: - ))。在C#cus.Name = "Jim" ;是绝对有效的。原因是看起来像一个任务是一个真正的“setter”函数调用。这个函数可以用你想要的任何代码重新定义,但是调用它的语法仍然是cus.Name = "Jim" ;

这被称为引用一致性,它是一个真正的可怜的Java不支持它。

1

如果设置Name属性更改状态或执行一个您决定不应该对客户类的用户透明的操作,请使用方法方法。使用财产方法的一切。

+0

说我需要做一些事情,如授权名称是一个真正的名称之前设置它我应该使用的方法? – William

+0

我会使名称只读(getter唯一属性),并使公共布尔SetNameIfAuthorized(字符串名称) – TakeMeAsAGuest