为什么C#没有限制'构造函数调用必须是构造函数中的第一个语句'

时间:2018-01-31 08:08:44

标签: java c#

我对java中构造函数和c#中的构造函数调用感到困惑。

当从默认构造函数中调用另一个构造函数而不是第一个语句时,Java显示错误

  

构造函数调用必须是构造函数中的第一个语句

...但是C#允许从构造函数的任何语句调用构造函数。

有人可以清楚这个为什么c#允许从默认构造函数中的语句的任何一行调用另一个构造函数吗?

爪哇:

public class A { 
    A()
    {     
        // this(1);// ->> works fine if written here
        System.out.println("1");
        this(1);  //Error: Constructor call must be the first statement in a constructor
    }
    A(int a)
    {
        System.out.println("2");
    }
}

C#:

public class A { 
    public A()
    {     
        Console.WriteLine("Default constructor called");
        new A(1);  
    }
    public A(int a)
    {
        Console.WriteLine("Parametrised constructor called");
    }
}

2 个答案:

答案 0 :(得分:8)

你的两个代码示例不一样!
对于C#,它应该是:

public class A
{ 
    public A() : this(1)
    {     
        Console.WriteLine("Default constructor called");
    }
    public A(int a)
    {
        Console.WriteLine("Parametrised constructor called");
    }
}

在您的示例中,您只是创建了A的第二个实例。这也适用于Java。

答案 1 :(得分:7)

这两个代码段不相同。您正在寻找C#中的this(1)(或base(1),可以与Java中的super(1)进行比较。)

您现在正在构造函数中构造一个新对象,在创建它之后会立即超出范围,因为您没有分配它。

如果你在构造函数体内调用this(1),C#会给出同样的错误,所以是的,它们都以相同的方式工作。在C#中,你甚至无法在构造函数内的任何地方调用this(1)。它应该像这样附加:

public A() : this(1)
{ }