2013-04-30 92 views
0

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

如果我想要私人领域的成员方法只使用,而不是暴露给外部世界?

我可以继续使用私人领域,而不破坏封装或任何正确的?

什么我不理解的是两个概念:我们可能需要暴露给外界VS中的数据的数据,我们可能不需要这么做(在类的外围)..

在谈论建造一堂课时,这两种数据是什么?

在下面的示例中,专用字段“名称”对于该类是私有的,但仍然可以由外部世界获取/设置。这里的抽象是'不是直接暴露在'你'在这里 - 有'它,而是添加一个间接的访问机制或更新?当我们谈论公共领域vs公共财产时,我们在这里讨论的是封装吗?

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

你为什么要使用的方法不是属性有用对于'Name',为什么你的二传手没有设置任何东西?这是一个非常奇怪的例子。 – 2013-04-30 15:02:18

+0

谢谢,Jon提出这个问题。我实际上从这里抓住了这个例子:http://msdn.microsoft.com/en-us/library/st6sy9xe.aspx – Athapali 2013-04-30 15:04:04

+0

我建议你阅读维基百科封装[link](http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)) – Tombala 2013-04-30 15:05:29

回答

0

如果你问什么是具有公共get/set访问时,你可以只是使实际现场公众的角度来看,这是因为你有自由随后更改类的私有实现的那场,无需更改客户端代码。例如,你可以添加一个检查,如果setter获得有效的输入,或者甚至完全改变private字段的数据类型,但是在setter中正确转换它。

编辑:

如在评论中提到

SetName(),为奇数加法。它实际上应该改变名称(并带一个参数),而不是返回一个字符串。

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

    } 
} 
0

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

 private decimal accountBalance = 500.00m; 

     public decimal CheckBalance() 
      { 
      return accountBalance; 
      } 

,并在那里获取和设置都是对对象成员的值的变化触发事件,而