Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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#_Constructor - Fatal编程技术网

C# 由于其保护级别而无法访问?

C# 由于其保护级别而无法访问?,c#,constructor,C#,Constructor,一般来说,我对编码还是比较陌生的,虽然这个简单的程序只是用来测试构造函数是如何工作的,但我还是想知道为什么会出现这个错误 using System; public class methodTest { int a; int b; int c; public methodTest(int i, int j, int k) { a = i; b

一般来说,我对编码还是比较陌生的,虽然这个简单的程序只是用来测试构造函数是如何工作的,但我还是想知道为什么会出现这个错误

    using System;

    public class methodTest
    {
        int a;
        int b;
        int c;
         public methodTest(int i, int j, int k)
        {
            a = i;
            b = j;
            c = k;
        }
    }

    public class methodObj
    {
        static void Main()
        {
        methodTest obj = new methodTest(10, 20, 30);
        Console.WriteLine("obj = " + obj.b);
        Console.ReadKey();
        }
    }
我不完全确定我为什么会出错。问题在于Console.WriteLine,它表示无法访问obj.b。这些变量似乎是在公共类中声明的,那么为什么不能访问它们呢?我试图寻找解决这个问题的方法,但我发现的所有问题都太复杂了,我无法得到一个我能理解的答案。
感谢大家的帮助

即使变量在公共类中,它们也必须声明为公共,因为默认情况下它们是私有的

见:

类成员(包括嵌套类和结构)可以是公共的, 受保护的内部、受保护的、内部的或私有的访问级别 用于类成员和结构成员,包括嵌套类和 结构,默认情况下是私有的

最好使用大写的名称和公共变量

public A { get; set; }
属性允许您控制成员的读/写访问,以及在读取或设置它们时添加逻辑。

您的问题是,在C#中,如果变量(在本例中,
字段
)没有特别用访问修饰符标记,则将其标记为
私有

类和结构默认为
internal
,字段、方法、事件、属性等(基本上是类和
结构的所有成员)默认为
private

inta
更改为
public inta
(b/c也是如此)将修复此问题

不过,我建议不要这样做。相反,为每个对象创建一个属性

public A { get { return a; } set { a = value; } }
public B { get { return b; } set { b = value; } }
public C { get { return c; } set { c = value; } }

这不是由构造函数引起的。之所以会出现错误,是因为字段
methodTest.b
是私有的(在C#中,默认情况下字段是私有的;您需要指定一个显式修饰符,例如
public int b;
)。

如果您想从类外部访问整数a、b和C,则,您必须将它们声明为
public
。但是,更干净的选择是使用属性,例如:

public int A {get; set;}
public int B {get; set}
public int C {get; set;}
public int A {get; private set;}
public int B {get; private set}
public int C {get; private set;}
这将设置您可能限制来自外部类的写访问,同时仍然保持属性打开以供读取,例如:

public int A {get; set;}
public int B {get; set}
public int C {get; set;}
public int A {get; private set;}
public int B {get; private set}
public int C {get; private set;}

访问修饰符是用于指定成员或类型的已声明可访问性的关键字。本节介绍四个访问修饰符:

可以使用访问修饰符指定以下五个可访问性级别:

  • 公共:访问不受限制
  • 受保护的:访问仅限于包含的类或类型 从包含类派生
  • 内部:访问权限仅限于当前程序集
  • 受保护内部:访问仅限于当前程序集或 从包含类派生的类型
  • 私有:访问仅限于包含类型
  • C#
    中的每个成员都是隐式私有的,因此在您的问题中
    a、b
    C
    被定义为
    private
    ,因此您无法从
    methodTest
    外部访问它们。 有关更多信息,您可能需要查看此页面:


    祝你好运!:)

    变量隐式地
    私有
    。在缺少访问说明符的情况下,它们无法访问任何非该类的对象。@EBrown值得注意的是,这里的私有变量a、b和c更精确地称为字段。@phoog确实,这也添加到了我的答案中。默认情况下私有规则不适用于所有类和结构成员吗,包括属性、方法和事件?这些不是变量,是的。是的。假定类和结构的所有成员都是私有的。