C#类成员访问

时间:2013-04-30 15:01:06

标签: c# properties field encapsulation

C#类数据成员(字段或属性)可以是私有的,也可以是公共的或受保护的。

如果我只想使用成员方法的私有字段而不是暴露给外界,该怎么办?

我可以继续使用私有字段,而不会破坏封装或其他任何东西吗?

我不理解的是两个概念:我们可能需要暴露给外部世界的数据与我们可能不需要这样做的数据(在类的外围)。

在谈论建立课程时,这两种类型的数据是什么?

在下面的示例中,私有字段“name”对于类是私有的,但仍然可以通过外部世界获取/设置。那么这里的抽象是“不直接暴露在这里,你去的地方”,而是添加一个间接的访问或更新机制?当我们谈论公共领域与公共财产时,这是我们在谈论的封装吗?

class Employee2
{
    private string name = "Harry Potter";
    private double salary = 100.0;

    public string GetName()
    {
        return name;
    }

    public void SetName(string title, string fullName)
    {
       this.name = title + fullName;        
    }

    public double Salary
    {
        get { return salary; }
    }
}

class PrivateTest
{
    static void Main()
    {
        Employee2 e = new Employee2();

        // The data members are inaccessible (private), so 
        // they can't be accessed like this: 
        //    string n = e.name; 
        //    double s = e.salary; 

        // 'name' is indirectly accessed via method: 
        string n = e.GetName();

        // 'salary' is indirectly accessed via property 
        double s = e.Salary;
    }
}

3 个答案:

答案 0 :(得分:3)

通过使用protected关键字,可以限制属性或方法可以在声明它的类中以及从声明此成员的类派生的任何类中进行访问。 (MSDN)

class Employee2
{
    private string name = "Harry Potter";
    private double salary = 100.0;

    protected string GetName()
    {
        return name;
    }

    protected string SetName(string newName)
    {
        this.name = newName;
    }

    protected double Salary
    {
        get { return salary; }

    }
}

答案 1 :(得分:0)

如果您在询问公共获取/设置访问器的重点是什么时可以将实际字段公开,那是因为您可以自由地在以后更改该字段的类私有实现,而无需更改客户端代码。例如,您可以添加检查setter是否获得有效输入,甚至可以完全更改私有字段的数据类型,但在setter中正确转换它。

编辑:

评论中提到的

SetName()是一个奇怪的补充。它实际上应该更改名称(并采用参数),而不是返回字符串。

答案 2 :(得分:0)

封装意味着对象的内部表示通常在对象定义之外的视图中隐藏。通常,只有对象自己的方法可以直接检查或操作其字段

       private decimal accountBalance = 500.00m;

       public decimal CheckBalance() 
          {
            return accountBalance;
          }

并且get和set对于在对象成员的值更改时触发事件非常有用