我们无法从在类外部创建的对象访问类的私有变量,但是可以在类中创建相同的对象时访问它本身。为什么??
class Program
{
private int i;
public void method1()
{
Program p = new Program();
p.i = 5; // OK when accessed within the class
}
}
class AnotherClass
{
void method2()
{
Program p = new Program();
p.i = 5; //error because private variables cannot be accessed with an object which is created out side the class
}
}
现在我觉得每个人都明白我的观点?
在上述两种情况中,我们通过对象'p'访问私有变量'i'。但在课堂上允许,不允许在课堂外。谁能告诉我背后的原因?
答案 0 :(得分:4)
您可以从班级中访问i,因为私人成员只能由班级成员访问。在这种情况下,它看起来很奇怪,因为p是一个与访问变量的对象不同的对象,但它仍然是同一个类,限制是在类级别而不是在对象级别。
class Program
{
private int i;
public void method1()
{
Program p = new Program();
p.i = 5; // OK when accessed within the class
}
}
你不能从另一个类中访问i(除非它是一个内部类,但这是一个不同的故事)。这完全符合预期。
class AnotherClass
{
void method2()
{
Program p = new Program();
p.i = 5; //error because private variables cannot be accessed with an object which is created out side the class
}
}
我理解你想要的观点。对班级的限制看起来与直觉相反。也许这是错的。但是成员变量仍然只能从类中访问,因此您仍然可以完全控制以保证私有化的封装。
答案 1 :(得分:3)
为什么?
语言规范确实如此。访问修饰符private
具有只允许声明成员的class
或struct
访问该成员的语义。
我建议您阅读详细说明。特别是,请查看
§3.5.1声明可访问性
§3.5.4可访问性约束
§10.2.3访问修饰符
§10.2.6.2声明可访问性
§10.2.6.5访问包含类型的私有和受保护成员
答案 2 :(得分:2)
在上述两种情况中,我们通过对象'p'访问私有变量'i'。但在课堂上允许,不允许在课堂外。谁能告诉我背后的原因?
由于访问修饰符与对象无关,因此它们属于{strong>类(或程序集,适用于{{1} }修饰符)。
即使您从其他对象或静态上下文访问它,只要您保持在同一个类中,访问internal
成员即可。它是私有的,而不是它的实例。
答案 3 :(得分:0)
您可能会混淆对象和类,public / private / protected / internal影响类可见性而不是对象可见性。这意味着类的对象可以访问同一类的另一个对象的属性,即使它们是私有的。
我不确定我是否理解你的问题......
答案 4 :(得分:0)
如果在课外访问是需要的选项,那么尝试属性。
答案 5 :(得分:0)
这属于OOP。答案是因为它是私有的,否则如果所有私有变量都可以从类外部访问,那么对象的概念就没有任何意义。
答案 6 :(得分:0)
您可以在以下过程中访问私有变量......
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();
}
}
}