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();
    }
}

C#-为什么不';t构造函数写入初始化的值

此代码:

 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)的值,因为您没有在构造函数本身中设置该值。