我见过一些 C# 代码声明一个带有internal
修饰符的类,带有一个public
构造函数:
internal class SomeClass
{
public SomeClass()
{
}
}
如果整个类的可见性是内部的,那么拥有公共构造函数有什么意义,因此只能在定义程序集中看到它?
另外,如果SomeClass是嵌套类,这是否有意义?
我见过一些 C# 代码声明一个带有internal
修饰符的类,带有一个public
构造函数:
internal class SomeClass
{
public SomeClass()
{
}
}
如果整个类的可见性是内部的,那么拥有公共构造函数有什么意义,因此只能在定义程序集中看到它?
另外,如果SomeClass是嵌套类,这是否有意义?
internal class
范围覆盖构造public MyClass()
函数范围,使构造函数internal
。
在构造函数上使用public
可以更轻松地将类更新到public
以后,但会混淆意图。我不这样做。
编辑3:我错过了你的部分问题。如果您的类是嵌套的,那么这样做仍然可以。嵌套没有任何区别,即使它嵌套在...中的公共类中的私有类中(请参阅C# 语言规范 - 3.5.2 可访问性域)。
编辑:而且,如果我记得,如果 ctor 是internal
,它不能用作需要约束的泛型类型where T : new()
,这将需要一个public
构造函数(参考C# 语言规范(版本 4.0)- 4.4.3 Bound和未绑定的类型)。
编辑 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>();
}
}
通常,成员的可访问性不大于包含它的类型的可访问性。但是,如果成员实现接口方法或覆盖在公共基类中定义的虚拟方法,则可以从程序集外部访问内部类的公共成员。
因此,例如,如果您有一个公共接口的内部实现,您仍然可以将某些成员公开为公共的。
此外,假设您突然希望您的内部类是公开的。更改类的访问修饰符比更改所有成员要容易得多。