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

7

我对编程还比较新,虽然这个简单的程序只是为了测试构造函数的工作原理,但我仍然想知道为什么会出现这个错误。

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。这些变量似乎是在公共类中声明的,那么为什么不能访问它们呢?我尝试寻找解决方法,但我找到的所有问题都太复杂了,我无法得到一个我能理解并翻译给自己的答案。

非常感谢您的帮助!


3
变量默认为“私有”。如果没有指定访问权限,则对于除了该类之外的任何东西都是不可访问的。 - Der Kommissar
2
@EBrown 值得注意的是,这里的私有变量 a、b 和 c 更精确地称为“字段”。 - phoog
@phoog,的确,我也会在我的回答中加上这个。 - Der Kommissar
5个回答

13
即使变量在公共类中,它们也必须声明为 public,因为默认情况下它们是私有的。
参见:访问修饰符

类成员(包括嵌套类和结构体)可以是 public、protected internal、protected、internal 或 private。 类成员和结构体成员(包括嵌套类和结构体)的访问级别默认为 private

最佳实践是对公共变量使用大写名称和 属性(properties)
public A { get; set; }

属性允许您控制成员的读写访问,并在读取或设置时添加逻辑。


5

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

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

  1. public: 访问不受限制。
  2. protected: 访问仅限于包含类或派生自包含类的类型。
  3. internal: 访问仅限于当前程序集。
  4. protected internal: 访问仅限于当前程序集或派生自包含类的类型。
  5. private: 访问仅限于包含类型。

C# 中的所有成员默认为私有,因此在您的问题中,a、bc 被定义为 private,所以无法从 methodTest 外部访问它们。若要获取更多信息,请查看此页面: 访问修饰符 (C# 编程指南)

祝您好运!:)


1
这不是由构造函数引起的。你会得到这个错误,因为字段methodTest.b是私有的(在C#中,字段默认是私有的;你需要指定一个显式的修饰符,例如public int b;)。

0
你的问题在于,在C#中,如果变量(在这种情况下是fields)没有明确标记访问修饰符,它们会被标记为private

https://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx

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

int a 更改为 public int a(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; } }

1
私有默认规则不适用于所有类和结构成员,包括属性、方法和事件吗?这些不是变量。 - phoog
是的,私有成员对于所有类和结构的成员都是默认的。 - Der Kommissar

0
如果你想从类外部访问你的整数 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;}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接