【问题标题】:Inaccessible due to its protection level?由于其保护级别而无法访问?
【发布时间】:2015-09-26 23:06:55
【问题描述】:

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

    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。这些变量似乎是在公共类中声明的,那么为什么不能访问它们呢?我试图寻找解决方案,但我发现的所有问题都太复杂了,以至于我无法得到可以转化为我自己理解的答案。 所有帮助表示赞赏!

【问题讨论】:

  • 变量隐式为private。在缺少访问说明符的情况下,任何东西都无法访问它们,因为它们不是那个确切的类。
  • @EBrown 值得注意的是,这里的私有变量 a、b 和 c 更准确地称为 字段。
  • @phoog 确实,也将其添加到我的答案中。

标签: c# constructor


【解决方案1】:

您的问题是,在 C# 中,变量(在本例中为 fields)如果没有专门用访问修饰符标记,则标记为 private

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

类和结构默认为internal,字段、方法、事件、属性等(基本上,classesstructures所有成员)默认为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; } }

【讨论】:

  • 默认情况下私有规则是否也适用于所有类和结构成员,包括属性、方法和事件?这些不是变量。
  • 是的。确实如此。假定类和结构的所有成员都是私有的。
【解决方案2】:

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

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

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

C# 中的每个成员都是隐式私有的,因此在您的问题中,a,bc 被定义为private,因此您无法从methodTest 外部访问它们。 有关更多信息,您可能需要查看此页面: Access Modifiers (C# Programming Guide)

祝你好运! :)

【讨论】:

    【解决方案3】:

    如果您想从实例化它们的类外部访问整数 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;}
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        见:Access Modifiers

        类成员,包括嵌套类和结构,可以是公共的, 受保护的内部、受保护的、内部的或私有的。 访问级别 对于类成员和结构成员,包括嵌套类和 structs,默认是私有的

        最佳做法是使用大写名称和properties 作为公共变量。

        public A { get; set; }
        

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

        【讨论】:

          猜你喜欢
          • 2011-09-01
          • 1970-01-01
          • 2011-04-02
          • 2011-02-07
          • 2012-01-25
          • 2022-01-18
          • 2019-06-28
          相关资源
          最近更新 更多