2013-05-11 34 views
11

我見過的聲明與internal改性劑一類的一些C#代碼,用public構造:什麼在一個內部類的公共構造意味着

internal class SomeClass 
{ 
    public SomeClass() 
    { 
    } 
} 

什麼是具有公共構造點,如果整個類的可見性是內部的,那麼只能在定義的程序集內部才能看到它?

此外,這是否有任何意義的情況下SomeClass是一個嵌套類?

+2

如果使用內部構造函數創建內部UserControl,Win Forms設計器將會出現問題。 – DaveShaw 2013-05-11 18:54:02

+1

將班級上的訪問修飾符想象成一種「主開關」,它可以設置所有班級成員的*最大*可訪問性。 – 2013-05-11 19:01:24

+0

@ChrisMcGrath。很大程度上,我會同意,雖然這個問題也會詢問關於類的嵌套(我在第一次閱讀時錯過了,所以我已經在編輯中解決了我的答案)。 – 2013-05-11 19:37:38

回答

14

internal class範圍覆蓋public MyClass()構造範圍,使得構造internal

在構造函數上使用public可以更容易地將該類稍後更新爲public,但會混淆意圖。我不這樣做。

編輯3:我錯過了你的部分問題。如果你的類是嵌套的,那麼這樣做還是很好的。嵌套不能有任何區別,即使它嵌套在公共類中的私有類中(參見C# language specification - 3.5.2 Accessibility domains)。

編輯:而且,如果我還記得,如果構造函數是internal,它不能作爲一種通用型哪裏有需要where T : new()的約束,這將需要public構造(REF C# language specification (version 4.0) - 4.4.3 Bound and unbound types) 。

編輯2:代碼示例演示上述

class Program 
{ 
    internal class InternalClass { 
     internal InternalClass() { } 
    } 
    internal class InternalClassPublicCtor { 
     public InternalClassPublicCtor() { }   
    } 
    internal class GenericClass<T> 
     where T : new() {} 

    static void Main(string[] args) { 
     GenericClass<InternalClass> doesNotCompile = new GenericClass<InternalClass>(); 
     GenericClass<InternalClassPublicCtor> doesCompile = new GenericClass<InternalClassPublicCtor>(); 
    } 
} 
+0

我對混淆意圖有着同樣的想法,除非你有很多構造函數,在更新之後將你的構造函數改爲public並不是太困難,許多重構工具也會提出這個問題 – 2013-05-12 01:21:34

0

internal關鍵字是類型和類型成員的訪問修飾符。內部成員只能在同一個程序集的文件中訪問。

實施例: Microsoft internal modifier

+0

但是這個問題並沒有問到內部修飾符的作用......? – 2013-05-11 19:07:11

6

MSDN - Access Modifiers (C# Programming Guide)

通常,成員的可訪問不大於包含它的類型的可訪問更大。但是,如果成員實現接口方法或覆蓋公共基類中定義的虛擬方法,則可以從程序集外部訪問內部類的公共成員。

因此,例如,如果您有一個公共接口的內部實現,您仍然可以公開某些成員。

此外,假設您突然想讓您的內部課程公開。簡單地更改類中的訪問修飾符比所有成員更容易。

相關問題