【问题标题】:C# internal Access Specifiers,C# 内部访问说明符,
【发布时间】:2017-09-17 01:57:15
【问题描述】:

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

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

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 类

【问题讨论】:

  • 如果你想从它的程序集外部访问它,为什么你首先将它标记为内部?
  • 可能是您混淆了命名空间和程序集术语?
  • 您确定namespace Assembly_1 确实是在不同的项目中定义的吗?我很确定它不是。它与namespace Assembly_2 在同一个项目(程序集)中
  • 所以,@Bharat 了解了 google 中程序集和命名空间之间的区别
  • “可能是您混淆了命名空间和程序集术语?”是 Ofir 在您提出问题后几分钟的评论。在这次“对话”中多次重申。

标签: c# access-specifier


【解决方案1】:

正如我在 cmets 中所写的:

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

许多命名空间可以在单个assembly 中定义。

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

【讨论】:

    【解决方案2】:

    如何在 Assembly_1 之外访问 B 类?

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

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

    您所称的Assembly_1Assembly_2 是同一个程序集 中的命名空间

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

    【讨论】:

    • 对不起@CodeCaster,但 Ofir 在所有讨论中都支持我,所以他应该得到加分,也谢谢你..
    • @Bharat 我真的不在乎声望点,这就是我将其发布为社区 wiki 的原因。
    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 2012-06-05
    • 2011-04-16
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多