2017-04-20 75 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