c#类成员访问

本文关键字:访问 成员 | 更新日期: 2023-09-27 18:11:27

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

c#类成员访问

通过使用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; }
    }
}

如果您在问,当您可以将实际字段设置为公共时,使用公共get/set访问器有什么意义,这是因为这样您就可以自由地更改该字段的类的私有实现,而无需更改客户端代码。例如,您可以添加一个检查setter是否获得有效的输入,或者甚至完全改变private字段的数据类型,但在setter中正确地转换它。

编辑:

注释中提到的

SetName()是一个奇怪的添加。它实际上应该更改名称(并接受一个参数),而不是返回一个字符串。

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

       private decimal accountBalance = 500.00m;
       public decimal CheckBalance() 
          {
            return accountBalance;
          }

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