C#-为什么不';t构造函数写入初始化的值
本文关键字:初始化 构造函数 为什么不 C#- | 更新日期: 2023-09-27 17:58:30
为什么此代码不输出值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();
}
}
此代码:
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
仍然引用第一个对象,而不是新创建的对象。)
这段代码首先构造类,然后将50分配给MyInt
属性,在执行完Console.WriteLine
之后。
您对对象初始值设定项的使用本质上转化为:
var temp = new TestConstructor();
temp.MyInt = 50;
var myClass = temp;
该属性是在构造函数完成后设置的。如果你想确保在构造函数中设置属性,你需要提供一个接受参数的构造函数:
public TestConstructor(int myInt)
{
MyInt = myInt;
Console.WriteLine(MyInt);
}
以以下方式使用它将向控制台窗口显示提供的整数:
var myClass = new TestConstructor(50);
您的代码被翻译为
var myClass = new TestConstructor(); //Here occures Console.Write(). myInt is 0 now
myClass.MyInt = 50;
因为您使用的语法首先创建对象并调用构造函数,然后设置您的值。
您正在调用新的TestConstructor(),而这只是您第二次坐在属性上!
当使用像您正在使用的对象初始值设定项时,首先调用默认构造函数,然后设置您正在设置的各种属性和字段。
这意味着您可能在控制台中看到default(int)
的值,因为您没有在构造函数本身中设置该值。