为什么这段代码输出的值不是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();
}
}
答案 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)
的值,因为您没有在构造函数本身中设置该值。