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

时间:2011-03-08 05:47:05

标签: c# .net oop

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

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'。但在课堂上允许,不允许在课堂外。谁能告诉我背后的原因?

7 个答案:

答案 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具有只允许声明成员的classstruct访问该成员的语义。

我建议您阅读详细说明。特别是,请查看

§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();    
        }          
    }    
}