我们可以使用对象访问私有变量吗?

我们无法从在类外部创建的对象访问类的私有变量,但是当在类内部创建相同的对象时,可以访问它本身。 为什么??

class Program { private int i; public void method1() { Program p = new Program(); pi = 5; // OK when accessed within the class } } class AnotherClass { void method2() { Program p = new Program(); pi = 5; //error because private variables cannot be accessed with an object which is created out side the class } } 

现在我觉得每个人都明白我的观点?

在上述两种情况中,我们通过对象’p’访问私有变量’i’。 但在课堂上允许,不允许在课堂外。 谁能告诉我这背后的原因?

您可以从类中访问i,因为私有成员只能由类的成员访问。 在这种情况下,它看起来很奇怪,因为p是一个与访问变量的对象不同的对象,但它仍然是同一个类,限制是在类级别而不是在对象级别。

 class Program { private int i; public void method1() { Program p = new Program(); pi = 5; // OK when accessed within the class } } 

你不能从另一个类中访问i(除非它是一个内部类,但这是一个不同的故事)。 这完全符合预期。

 class AnotherClass { void method2() { Program p = new Program(); pi = 5; //error because private variables cannot be accessed with an object which is created out side the class } } 

我理解你要提出的观点。 对class级的限制看起来与直觉相反。 也许这是错的。 但是成员变量仍然只能从类中访问,因此您仍然可以完全控制以保证私有化的封装。

为什么??

语言规范也是如此。 访问修饰符private具有语义,只允许声明成员的classstruct访问该成员。

我建议阅读规范以获取详细信息。 特别是退房

§3.5.1声明可访问性

§3.5.4可访问性约束

§10.2.3访问修饰符

§10.2.6.2声明的可访问性

§10.2.6.5访问包含类型的私有和受保护成员

在上述两种情况中,我们通过对象’p’访问私有变量’i’。 但在课堂上允许,不允许在课堂外。 谁能告诉我这背后的原因?

由于访问修饰符与对象无关,因此它们属于 (或internal修饰符的程序集 )。

即使您从不同的对象或静态上下文访问它,只要您保持在同一个类中,访问private成员将起作用。 它是私有的,而不是它的实例。

您可能会混淆对象和类,public / private / protected / internal影响类可见性而不是对象可见性。 这意味着类的对象可以访问同一类的另一个对象的属性,即使它们是私有的。

我不确定我是否理解你的问题……

如果在类外访问是需要的选项,那么尝试属性。

这属于OOP 。 答案是因为它是私有的,否则如果所有私有变量都可以从类外部访问,那么对象的概念就没有任何意义。

您可以在以下过程中访问私有变量…

 namespace OOPSProj { class Program { private int i; public void Methode1() { Program objprog2 = new Program(); objprog2.i = 15; Console.WriteLine("i= " + objprog2.i); } static void Main(string[] args) { Program objprog = new Program(); objprog.i = 10; Console.WriteLine("i= " + objprog.i); objprog.Methode1(); } } class Test { static void Main() { Program objproj3 = new Program(); objproj3.Methode1(); } } }