【问题标题】:Encapsulation in relation to automatic properties与自动属性相关的封装
【发布时间】:2013-08-17 23:50:18
【问题描述】:

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

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

【问题讨论】:

    标签: c# methods properties encapsulation


    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 说我需要在设置它之前做一些类似授权名称是真实姓名的事情我应该使用该方法吗?
      • 我会将 Name 设为只读(仅限 getter 属性)并创建一个类似 public bool SetNameIfAuthorized(string name) 的方法
      【解决方案3】:

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

      这叫做引用一致性,真是可惜Java不支持它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        相关资源
        最近更新 更多