c# - 基类构造函数被击中而不调用它?

标签 c# oop

给定代码:

public class A
{
    public A()
    {
        throw new Exception();
    }
}

public class B : A
{
    public B(int i)
    {

    }
}

然后运行该行:

  var x = new B(2);

我永远不会期望 A 的构造函数被命中(除非我添加 base())到 B 的末尾构造函数声明。

奇怪的是它似乎被击中(并抛出异常)。这是默认行为吗?这让我很吃惊,因为我完全没想到 A 的构造函数会被命中

最佳答案

如果您不包含任何 base(..)this(..),它的作用与您拥有 base( )。来自 C# spec :


如果实例构造函数没有构造函数初始值设定项,则隐式提供 base() 形式的构造函数初始值设定项。因此,形式的实例构造函数声明

C(...) {...}

完全等同于

C(...): base() {...}

您可能一直在寻找使 A 成为 abstract class 的方法,这样您就无法直接创建 A 的实例。

public abstract class A
{
}

public class B : A
{
    public B(int i)
    {

    }
}

public static void Main()
{
    // A a = new A(); // doesn't compile
    A a = new B(2); // valid
}

关于c# - 基类构造函数被击中而不调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18852179/

相关文章:

c# - 为什么我们可以在类之外声明委托(delegate)?这不是反对 OOP 概念吗?

c# - Wpf 产品在未安装 MS Office 的情况下导出到 Excel

c# - 将对象转换为 C# 类

c# - 无法连接到 Crystal Reports 2008

c# - 断言 C#(社交)单元测试不使用 HTTP

java - 具有类特定属性的最佳解决方案

c# - 不确定何时使用抽象属性,何时不使用

python - 防止在 __init__ 之外创建新属性

c++ - 具有不同接口(interface)的对象集合

c# - WPF中如何将数据绑定(bind)到gridcontrol