【问题标题】:Can internal classes be accessed within other namespaces?可以在其他命名空间中访问内部类吗?
【发布时间】:2017-11-27 14:16:37
【问题描述】:

我目前正在网上阅读这本书: http://www.angelfire.com/theforce/chewy0/csharp/Thinking_in_C-Sharp_.pdf

在第 23 页(PDF 文档的第 38 页)中指出,internal 类不能从外部namespaces 中的类访问。

然而,在在线 Microsoft 文档中,它指出 internal 类只能从相同的程序集访问。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/internal

据我了解,一个程序集可以包含来自多个命名空间的类。 这难道不意味着从 Microsoft 文档中可以跨不同的 命名空间 访问 internal 类吗?

或者说 internal 类在其受人尊敬的程序集命名空间中都是私有的,这是真的吗?

【问题讨论】:

    标签: c# .net namespaces assemblies


    【解决方案1】:

    所以这是摘录,对吧?

    Java 使用五个显式关键字来设置类的边界:public、 私有的、受保护的、内部的和受保护的内部的。它们的使用和 意思很简单。这些访问说明符确定谁 可以使用下面的定义。公开的意思如下 每个人都可以使用定义。另一方面,private 关键字 手,意味着除了你之外没有人可以访问这些定义, 类型的创建者,在该类型的成员函数内部。私人是一个 你和客户程序员之间的砖墙。如果有人试图 访问一个私有成员,他们会得到一个编译时错误。受保护 像私有的一样,除了继承类可以访问 受保护的成员,但不是私有成员。继承会 不久介绍。内部通常被称为“友好的”——定义可以 被同一命名空间中的其他类访问,就好像它是公共的一样, 但不同命名空间中的类无法访问。命名空间将 将在#ref# [原文如此] 章中深入讨论。受保护的内部允许 通过同一命名空间中的类(如内部)或通过 继承类(与受保护的一样),即使继承类是 不在同一个命名空间内。

    C# 的默认访问权限,如果您不使用其中一种 上述说明符,是内部的

    作者可能将Java 的internal 与c# 的internal 混为一谈。

    它们略有不同,因为 Java 没有程序集;它有包,将类组织到命名空间中。

    在 c# 中,命名空间与可访问性修饰符绝对没有关系。只有同一程序集中的类才能访问internal 类型或成员,除非您使用InternalsVisibleTo 属性。命名空间无关紧要。

    【讨论】:

      【解决方案2】:

      嗯,回答这个问题的最简单方法是测试它—— 所以我在 1 个程序集中创建了 2 个命名空间,并访问了一个内部变量。

      简短回答 - Microsoft 文档是正确的 - 即使您有 2 个不同的命名空间,也可以访问同一程序集中的内部变量。

      代码如下:

      namespace ConsoleApplication1
      {
          class Class1
          {
              internal string thing;
              public Class1()
              {
                  thing = "original data";
              }
          }
      }
      
      namespace ConsoleApplication2
      {
          class Class2
          {
              public ConsoleApplication1.Class1 class1= new ConsoleApplication1.Class1();
              public Class2()
              {
                  class1.thing = "other namespace modification";
              }
          }
      }
      

      调用Class2构造函数时,显示修改后的数据。

      var class2 = new ConsoleApplication2.Class2();
      Console.WriteLine(class2.class1.thing);
      

      结果:

      "other namespace modification"
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-08
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        相关资源
        最近更新 更多