2017-04-20 129 views
-4

我创建了一个ConsoleApplication来理解访问说明符。C#内部访问说明符,

以下是我的代码内部,我可以从大会外部访问此类。

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(); 
     } 
    } 
} 

我的问题

现在我可以访问的B类和它的派生中像FNB()的方法。

一切工作正常。但是如何?

如何进入B类以外Assembly_1

+0

*现在我可以访问类B,它的方法就像fnB()派生*你的意思是说你**不能**访问它们? – DavidG

+3

如果你想从组件外部访问它,为什么你首先在内部标记它? – CodeCaster

+1

你不能这就是访问修饰符的要点,如果你想在此项目之外使用它,请将其公开化 – EpicKip

回答

3

正如我又写道的评论:

你混淆了namespaceassembly条款。 你可以在这里阅读:(Assemblies and Namespace

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

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

1

如何在Assembly_1外部访问B类?

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

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

你叫什么Assembly_1Assembly_2命名空间相同装配内。

因为internal成员在同一个程序集中可见,所以可以使用Assembly_1.BAssembly_2.D,因为两个名称空间都驻留在同一个程序集中。

+0

对不起@CodeCaster,但是Ofir和我在所有的讨论中都站在一起,所以他应该得到额外的分数,谢谢你.. – Bharat

+1

@Bharat我真的不太在乎名誉点,这就是为什么我把它作为社区维基发布。 – CodeCaster