0

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

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

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

我不理解的是两个概念:我们可能需要向外界公开的数据与我们可能不需要这样做的数据(在类的外围)..

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

在下面的示例中,私有字段“名称”对于类是私有的,但对于/由外部世界仍然是可获取/可设置的。那么这里的抽象是“不直接公开,就像'你去-拥有它',而是添加一个间接的访问或更新机制?当我们谈论公共领域与公共属性时,这就是我们在这里谈论的封装吗?

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

3 回答 3

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

    }
}
于 2013-04-30T15:09:09.557 回答
0

如果您要问在可以将实际字段公开时拥有公共 get/set 访问器的意义何在,那是因为您以后可以自由更改该字段的类的私有实现,而无需更改客户端代码。例如,您可以检查 setter 是否获得有效输入,甚至完全更改私有字段的数据类型,但在 setter 中正确转换它。

编辑:

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

于 2013-04-30T15:05:39.523 回答
0

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

       private decimal accountBalance = 500.00m;

       public decimal CheckBalance() 
          {
            return accountBalance;
          }

以及 get 和 set 可用于触发对象成员值更改的事件

于 2013-04-30T15:12:00.190 回答