内部类的公共构造函数意味着什么

lys*_*cid 14 .net c# visibility internal

我已经看到一些C#代码声明了一个带有internal修饰符的类,带有一个public构造函数:

internal class SomeClass
{
    public SomeClass()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果整个类的可见性是内部的,那么拥有公共构造函数有什么意义呢?因此只能在定义程序集中看到它?

另外,如果SomeClass是嵌套类,这是否有意义?

And*_*own 16

internal class范围覆盖public MyClass()构造范围,使得构造internal.

public在构造函数上使用可以更容易地将类更新到public以后,但会混淆intent.我不这样做.

编辑3:我错过了你的部分问题.如果您的类是嵌套的,那么这样做仍然很好.嵌套不会有任何区别,即使它嵌套在...中的公共类中的私有类中(参见C#语言规范 - 3.5.2辅助功能域).

编辑:而且,如果我记得,如果ctor是internal,它不能用作需要约束的泛型类型where T : new(),这将需要一个public构造函数(参考C#语言规范(版本4.0) - 4.4.3绑定和未绑定的类型).

编辑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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为了使依赖注入和反射起作用,即使您的类是内部类,您也必须将构造函数标记为 public。 (2认同)

Ant*_*t P 8

MSDN - 访问修饰符(C#编程指南):

通常,成员的可访问性不大于包含它的类型的可访问性.但是,如果成员实现接口方法或覆盖在公共基类中定义的虚方法,则可以从程序集外部访问内部类的公共成员.

因此,例如,如果您有公共接口的内部实现,您仍然可以将某些成员公开为public.

另外,假设您突然希望内部类是公开的.简单地更改类上的访问修饰符要比所有成员容易得多.