C#和#x27;s";“内部保护”;是指「;“受保护”*或*";“内部”;。是否有任何关键字的意思是“引用”;“受保护”*及*’;内部;?

C#和#x27;s";“内部保护”;是指「;“受保护”*或*";“内部”;。是否有任何关键字的意思是“引用”;“受保护”*及*’;内部;?,c#,access-modifiers,C#,Access Modifiers,我需要声明一个既受保护又是内部的成员。然而,令我完全困惑的是,我刚刚发现“内部保护”实际上是指内部保护。是否有表示受保护和内部的访问修饰符?受保护和内部在C#(或任何其他高级.NET语言afaik)中不可用。尽管它受CLR支持,并且可以在IL中实现。内部类和受保护成员如何。引用Equiso的链接: 顺便说一句,CLR确实有ProtectedANDInternal的概念,但C#没有语法来指定它。如果查看CLR的System.Reflection.MethodAttributes枚举,您将看到Fam

我需要声明一个既受保护又是内部的成员。然而,令我完全困惑的是,我刚刚发现“内部保护”实际上是指内部保护。是否有表示受保护和内部的访问修饰符?

受保护和内部在C#(或任何其他高级.NET语言afaik)中不可用。尽管它受CLR支持,并且可以在IL中实现。

内部类和受保护成员如何。

引用Equiso的链接:

顺便说一句,CLR确实有ProtectedANDInternal的概念,但C#没有语法来指定它。如果查看CLR的System.Reflection.MethodAttributes枚举,您将看到FamANDAssem和FamORAssem(“Family”是CLR对C#受保护的术语,“Assem”是C#的内部术语)

您不能在C#中定义受保护的成员和内部成员,尽管CLR()支持它。

,但在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;
    }
}
公共类AccessHelper
{
内部T值{get;set;}
}
公共类AClass
{
公共AClass()
{
InternalProperty.Value=“除非您是此程序集中的派生类,否则无法获取或设置此属性。”;
}
受保护的AccessHelper内部属性
{
得到;
设置
}
}

@Rowland Shaw:我不能展示它。它是专有代码。哦,还有,你也不想看到我造成的巨大元编程混乱。通常情况下,
internal
就足够了,除非出于任何原因,你允许随机的人向你的程序集中添加类。@R.Bemrose:我知道,我知道。但这相当于为了实现面向组件的一致性而不必要地牺牲面向对象的一致性。基本上,你说的是“如果我的程序集对外部世界来说是一个黑匣子,那么谁会关心内部一致性我的程序集的内部设计?”更新了我下面的答案以包含一个解决方法。这可能会使您感到不安:我要声明为受保护的内部成员的类型在程序集之外甚至无法访问。因此,你的变通方法不起作用,它会起作用,除非你没有提到其他的事情。说真的,试试看。如果不行,请告诉我原因。它应该会起作用。在我的示例中,属性InternalProperty将在程序集外部可见,但该属性的Value属性不可见,因为值是内部的。这是您存储要保护的实际值和内部值的地方。抱歉,现在我了解您的建议。但这真是一件丑陋的事情。无论谁来维护我的项目,都会发现我并刺死我。(此外,对于每个需要伪造受保护内部成员的类,我需要一个
AccessHelper
。@Eduardo实际上,AccessHelper作为内部类是我的错误。它可以是公开的。只有属性的访问修饰符是相关的。我已经更新了代码示例以反映这一点。这让事情变得更干净了。显然,这仍然不理想。但比满是内部类要好得多。您可以使用属性将Visibly设置为某些.dll,但我认为您选择了错误的模式。使用复合模式或访问者代替继承。