与自动属性相关的封装

时间:2013-08-17 23:50:19

标签: c# methods properties encapsulation

请查看客户类的这个简单实现:

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和set选项。假设我需要更改客户名称。

通过类似的方法更改客户名称是否更可接受:

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

或者通过以下方式进行更改是可以接受的:

cus.Name = "Jim";

3 个答案:

答案 0 :(得分:1)

有一个改变属性的方法是不必要的。存在属性的原因是允许您围绕字段的访问实现其他逻辑。实质上,该属性创建一个私有字段并自动生成accessor / mutator方法。

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

答案 1 :(得分:1)

如果设置Name属性更改状态或执行您认为不应对客户类的用户透明的操作,请使用方法方法。使用属性方法来处理其他事情。

答案 2 :(得分:0)

你显然有Java背景(我也是如此:-))。在C#cus.Name = "Jim" ;中绝对有效。原因是看起来像一个赋值实际上是一个“setter”函数调用。可以使用您想要的任何代码重新定义此函数,但调用它的语法仍为cus.Name = "Jim" ;

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