C# 内部访问说明符,

C# internal Access Specifiers,

我已经创建了一个 ConsoleApplication 来理解访问说明符。

下面是我的 内部代码 ,我可以从 Assembly 外部访问这个 class。

namespace Assembly_1 //This is first assembly.
{       
   public class Base
   {
       //internal class
       internal class B
       {
          public static void fnB()
          {
            Console.WriteLine("fnB");
          }
       }        
   }    
}

namespace Assembly_2 //This is second assembly.
{   
    public class Derived : Assembly_1.Base
    {            
        public class D
        {
            public void fnD()
            {
                B.fnB();//how can I access this class?
            }
        }
    }
}

这就是我访问它的地方。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {                
            Assembly_2.Derived.D d = new Assembly_2.Derived.D();
            d.fnD();
        }
    }
}

我的问题

现在我可以访问 Class B 并且它的方法类似于 Derived 中的 fnB()。

一切正常。但是如何?

如何在Assembly_1之外访问B Class

How can I access the B Class outside Assembly_1?

因为您混淆了名称空间和程序集。程序集是一个或多个命名空间的集合,包含在 .dll 或 .exe 文件中。

另请参阅:MSDN: Assemblies in the Common Language Runtime and Understanding and Using Assemblies and Namespaces in .NET

你所说的 Assembly_1Assembly_2 是同一个 assembly.

中的 namespaces ]

因为 internal 成员在同一程序集中可见,您可以使用 Assembly_2.D 中的 Assembly_1.B,因为两个命名空间都位于同一程序集中。

正如我在评论中所写:

您混淆了 namespaceassembly 术语。 您可以在这里阅读:(Assemblies and Namespace)

可以在单个 assembly.

中定义许多命名空间

如果您想查看和了解 internal 修饰符, 那么你必须创建一个新的 class 库项目(它将编译成不同的程序集),在那里定义 Base class 并在您的主控制台应用程序中添加对它的引用。 然后你会看到你无法再访问它并且代码将无法编译。