使用属性和方法维护封装

时间:2014-08-14 21:23:18

标签: c# properties encapsulation

如果我有如下课程:

public class Name
{
    public String FirstName { get; set; }
    public String LastName { get; set; }

    public String FullName()
    {
        return FirstName + " " + LastName;
    }
}

FullName()连接名字和姓氏,因此它是一个方法是有意义的。假设我改变了类的工作方式,因此它将全名存储为字符串,FirstName和LastName返回子字符串。因此,FirstName和LastName是方法,而FullName是属性。我读了these guidelines关于使用属性的地方,这些属性声明属性不应该是相互依赖的。

没有使用属性和方法打破封装,因为这意味着您将内部实现细节暴露给外部代码?

在这种情况下,您不希望公开哪些值存储以及哪些值是派生的,您应该怎么做?据推测,他们应该都是方法,或者他们应该都属于哪些属性?

2 个答案:

答案 0 :(得分:1)

如果属性应该或不应该是独立的,这是有争议的。

我会说,在你的情况下,拥有财产

public String FullName { get { return FirstName + " " + LastName; } } // no set

看起来可以接受。

与.NET Rectangle.Bottom属性进行比较,该属性返回两个其他属性的总和

  

y坐标,即此矩形的Y和高度的总和。

答案 1 :(得分:0)

如果您想严格遵循这些准则,那么我将为First和Last名称创建完整属性,并在FullName上使用仅限访问者访问私有字段,因为他的指南仅提及属性依赖性而非字段依赖性。

我认为指南是基于事实逻辑可以在getter和setter中执行,走现场路线将消除风险

示例:

public class Name 
{
    private string _firstName;
    private string _lastName;

    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }

    public string LastName 
    {
        get { return _lastName; }
        set { _lastName = value; }
    }

    public string FullName
    {
        get { return _firstName + " " + _lastName; }
    }
}