【问题标题】:Why can I instantiate a class without a constructor in C#?没有构造函数的 C# 类
【发布时间】:2012-03-05 16:25:30
【问题描述】:

C# 中的类怎么可能没有定义构造函数? 比如我有一堂课

internal class TextStyle
{
    internal string text = "";
    internal Font font = new Font("Arial", 8);
    internal Color color = Color.Black;
}

并且在代码中这个类被实例化为

TextStyle textParameters = new TextStyle();

【问题讨论】:

    标签: c# .net class constructor


    【解决方案1】:

    如果您没有为非静态类声明任何构造函数,编译器会为您提供一个公共(或抽象类受保护的)无参数构造函数。你的类实际上有一个构造函数:

    public TextStyle()
    {
    }
    

    这在 C# 4 规范的第 10.11.4 节中有描述:

    如果类不包含实例构造函数声明,则会自动提供默认实例构造函数。该默认构造函数只是调用直接基类的无参数构造函数。如果直接基类没有可访问的无参数实例构造函数,则会发生编译时错误。如果类是抽象的,则默认构造函数的声明可访问性为protected。否则,默认构造函数声明的可访问性为public

    C# 中唯一没有任何实例构造函数的类是静态类,它们不能有构造函数。

    【讨论】:

    • 我正在编写一个需要 BlobDownloadInfo 实例的单元测试。尽管这个类似乎没有构造函数,即您希望 new BlobDownloadInfo() 可以工作,但编译器却在抱怨 'BlobDownloadInfo' does not contain a constructor that takes 0 arguments。所以我猜自从写下这个答案后,某些东西(某处)已经发生了变化.....
    • 似乎这个类可以以某种方式(巫毒?)只有generated using a factory
    • @Liam:我无法轻易找到该类的源代码(通过两分钟的搜索...),但我希望它有一个构造函数——只是不是一个可公开访问的构造函数。如果它没有在源代码中声明任何构造函数,我希望看到构造函数生成的无参数构造函数被记录下来(可能没有任何文本,只是注意到它的存在)。这里的语言没有任何变化。
    • @Liam:现在找到了源代码,正如预期的那样,有一个内部构造函数:github.com/Azure/azure-sdk-for-net/blob/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多