2011-04-08 95 views
2

我需要聲明一個內部受保護的成員。然而,對於我完全的困惑,我剛剛發現了「保護內部」實際上意味着受保護或內部的困難方式。是否有任何訪問修飾符,意味着內部保護C#的「受保護內部」是指「受保護」*或*「內部」。任何關鍵字是否意味着「受保護」*和*「內部」?

+0

@羅蘭肖:我無法顯示它。它是專有代碼。哦,還有,你不想看到我正在製作的巨大的元編程混亂。 – pyon 2011-04-08 14:16:00

+2

一般情況下'內部'就足夠了,除非出於任何原因你允許隨機的人爲你的程序集添加類。 – Powerlord 2011-04-08 14:16:25

+0

@R。 Bemrose:我知道,我知道。但是這相當於**不必要**犧牲了面向組件的一致性的面向對象的一致性。基本上,你說的是這樣的話:「誰會關心我的程序集的內部設計的內部一致性,如果它對外界來說是一個黑盒子?」 – pyon 2011-04-08 14:19:52

回答

6

雖然CLR supports it支持,在C#中有沒有辦法迫使一員是保護和內部。

C#和VB.NET都使用聯合而不是交集來結合訪問修飾符。

如果你絕對必須擁有它,有一個解決方法。它不乾淨,但它工作。您可以創建一個帶有內部屬性的助手類,然後將該內部類類型的受保護屬性添加到您的類中。受保護屬性的內部屬性只能在擁有程序集中的子類上訪問。

示例如下。我已經使用過泛型,因爲您可能需要多個受保護的不同類型的內部屬性。通用將允許您使用一個內部類而不管所需的屬性類型。

public class AccessHelper<T> 
{ 
    internal T Value { get; set; } 
} 

public class AClass 
{ 
    public AClass() 
    { 
     InternalProperty.Value = "Can't get or set this unless you're a derived class inside this assembly."; 
    } 

    protected AccessHelper<String> InternalProperty 
    { 
     get; 
     set; 
    } 
} 
+0

我想要聲明爲受保護的成員和內部成員的類型甚至不能在程序集外部訪問。因此,您的解決方法不起作用。 – pyon 2011-04-08 14:48:51

+0

它會起作用,除非你還沒有提到的其他事情。嚴重的是,試試看。如果它不起作用,請告訴我爲什麼。它應該工作。在我的示例中,屬性InternalProperty將在程序集外部可見,但不是該屬性的Value屬性,因爲值是內部值。這就是存儲你想要保護的實際值和內部的地方。 – 2011-04-08 14:51:12

+0

對不起,現在我得到你的建議。但這是一件非常醜陋的事情。無論誰去維護我的項目,都會找到我並刺死我。 (此外,我需要一個'AccessHelper '每個類需要僞造受保護的內部成員。) – pyon 2011-04-08 15:04:04

6

受保護的AND內部在C#(或任何其他高級.NET語言afaik)中不可用。雖然它得到了CLR的支持,並且可以在IL中實現。

0

內部類和受保護的成員如何?

+0

該類必須是公開的。 – pyon 2011-04-08 14:16:28

+0

您可以使用屬性將Visiblity設置爲確定。DLL,但我認爲你選擇了錯誤的模式。繼承使用複合模式或Visitor。 – 2011-04-08 14:58:18

3

從Equiso的鏈接舉例:

BTW的CLR確實有ProtectedANDInternal的概念,但是C#有沒有語法來指定。如果您查看CLR的System.Reflection.MethodAttributes枚舉,您將看到FamANDAssem和FamORAssem(「Family」是C#的CLR術語,「Assem」是C#的內部)。