C# - 为什么构造函数不写入初始值?

时间:2011-06-07 14:27:46

标签: c# .net

为什么这段代码输出的值不是50?

class Program
{
    static void Main(string[] args)
    {
        var myClass = new TestConstructor() { MyInt = 50 };
    }
}

class TestConstructor
{
    public int MyInt { get; set; }

    public TestConstructor()
    {
        Console.WriteLine(this.MyInt);
        Console.Read();
    }
}

7 个答案:

答案 0 :(得分:11)

此代码:

 var myClass = new TestConstructor() { MyInt = 50 };

有效地转化为:

var tmp = new TestConstructor();
tmp.MyInt = 50;
var myClass = tmp;

在构造函数执行之前,您希望如何设置属性?

(在这种情况下,临时变量的使用并不重要,但在其他情况下可能会这样:

var myClass = new TestConstructor { MyInt = 50 };
myClass = new TestConstructor { MyInt = myClass.MyInt + 2 };

在第二行中,myClass.MyInt仍然引用第一个对象,而不是新创建的对象,这一点很重要。)

答案 1 :(得分:10)

该段代码首先构造该类,然后MyInt属性 之后分配50 Console.WriteLine

答案 2 :(得分:3)

您对object initializer的使用基本上转化为:

var temp = new TestConstructor();
temp.MyInt = 50;
var myClass = temp;

构造函数完成后,属性被设置。如果要确保在构造函数中设置属性,则需要提供一个接受参数的构造函数:

public TestConstructor(int myInt)
{
    MyInt = myInt;
    Console.WriteLine(MyInt);
}

以下列方式使用它将向控制台窗口显示提供的整数:

var myClass = new TestConstructor(50);

答案 3 :(得分:2)

您的代码翻译为

 var myClass = new TestConstructor(); //Here occures Console.Write(). myInt is 0 now
 myClass.MyInt = 50;

答案 4 :(得分:1)

因为您首先使用的语法会创建对象并调用构造函数然后设置您的值。

答案 5 :(得分:1)

您正在调用新的TestConstructor(),并且只是在您第二次坐在该属性中!

答案 6 :(得分:1)

使用像您正在使用的对象初始值设定项时,首先调用默认构造函数,然后设置您设置的各种属性和字段。

这意味着您可能在控制台中看到default(int)的值,因为您没有在构造函数本身中设置该值。