我对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");
}
}
答案 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)
{ }