Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能访问C#中的私有字段吗?_C# - Fatal编程技术网

为什么可以';我不能访问C#中的私有字段吗?

为什么可以';我不能访问C#中的私有字段吗?,c#,C#,我想弄明白为什么我不能访问类程序中的私有字段 class Program { int marks; static void Main(string[] args) { Program p = new Program(); int s = p.marks; Console.Read(); } } 因为您是从同一类型中引用它。如果您使用专用字段创建了其他类型,则无法在type程序中访问它 这不是违反了封装规则吗学习数

我想弄明白为什么我不能访问类程序中的私有字段

class Program
{
    int marks;
    static void Main(string[] args)
    { 
        Program p = new Program();
        int s = p.marks;
        Console.Read();
    }
}

因为您是从同一类型中引用它。如果您使用专用字段创建了其他类型,则无法在type
程序中访问它


这不是违反了封装规则吗学习数学


否。封装是通过定义类型来完成的。方法
Main
和字段
marks
都存在于同一类型的
Program
Main()
方法是
Program
类型的成员,因此可以访问
private
成员。

您可以访问范围(类)内的私有字段
marks
声明的位置-在您的示例中,类
程序

不管它是静态方法还是类的其他实例。下面的内容也很好

class Program
{
    int marks;
    public int foo()
    { 
        Program p = new Program();
        return p.marks;
    }
}
见:

私有成员只能在类或类的主体内访问 在其中声明它们的结构


变量是在类
程序
中声明的,这就是您访问它的地方。

最简单的方法是,创建的对象与创建的类属于同一类型

另一件事要澄清访问私有成员的有用性,如本例中所示,请考虑如果您希望通过实现IClonable进行深度克隆,则可能需要复制对象的所有值,包括私有成员。如果无法访问私有成员,则可能无法完全(深入)执行克隆

此外,这篇文章:提到了一个深思熟虑的观点,那就是

限制在类级别,而不是对象级别


换句话说,私有成员在其类之外是不可访问的,而在类内部是不可访问的,这里的情况是,您仍然在与所创建对象类型相同的类中

因为您仍然在同一个程序类中,如果您在另一个类中,那么您的代码可以工作,并且可以操纵此代码来执行此任务,但不推荐使用此代码,因为您属于同一类型。如果您使用私有字段创建了另一个类型,则无法在type
Program
@LearningMath中访问它,因为它与您使用它的类在同一个类中,私有字段在它们定义的类中可用这不是违反了封装规则吗?不,它封装在该类中。为什么类不能访问它自己的东西?你的意思是为什么C#有类范围的私有变量而不是对象范围的私有变量?