【问题标题】:What does a public constructor on an internal class mean [duplicate]内部类的公共构造函数是什么意思[重复]
【发布时间】:2013-05-06 05:17:12
【问题描述】:

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

internal class SomeClass
{
    public SomeClass()
    {
    }
}

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

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

【问题讨论】:

  • 如果您使用内部构造函数创建内部 UserControl,Win Forms 设计器将出现错误。
  • 将类上的访问修饰符视为一种“主开关”,它设置所有类成员的最大可访问性。
  • @ChrisMcGrath。很大程度上我会同意,尽管这个问题也确实询问了关于类的嵌套(我在第一次阅读时错过了这个问题,所以我在对我的答案的编辑中解决了这个问题)。

标签: c# .net visibility internal


【解决方案1】:

internal class 范围覆盖 public MyClass() 构造函数范围,使构造函数为 internal。

在构造函数上使用public 可以更轻松地稍后将类更新为public,但会混淆意图。我不这样做。

编辑 3:我错过了你的部分问题。如果您的类是嵌套的,那么这样做仍然可以。嵌套没有任何区别,即使它嵌套在一个私有类中的一个公共类中...(参见C# language specification - 3.5.2 Accessibility domains)。

编辑:而且,如果我记得,如果 ctor 是 internal,它不能用作需要 where T : new() 的约束的泛型类型,这将需要public 构造函数(参考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>();
    }
}

【讨论】:

  • 我对混淆意图的想法相同,除非您有很多构造函数,在更新后将构造函数更改为公共应该不会太难,并且许多重构工具也会建议这一点
  • 为了使依赖注入和反射工作,即使你的类是内部的,你也必须将你的构造函数标记为 public。
【解决方案2】:

来自MSDN - Access Modifiers (C# Programming Guide):

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

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

此外,假设您突然希望您的内部类公开。更改类的访问修饰符比更改所有成员要容易得多。

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2017-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多