C# 什么叫第一对象初始值设定项或构造函数?
我想知道先叫什么 假设我有这个代码C# 什么叫第一对象初始值设定项或构造函数?,c#,c#-6.0,C#,C# 6.0,我想知道先叫什么 假设我有这个代码 public class MyObject { public MyObject() { MyNumber = 6; } public int MyNumber { get; set; } } 然后我叫它 var o = new MyObject {MyNumber = 8 }; 我的号码是-6还是8 假设我也设定了这个 public int MyNumber { get; set; } = 7; 点什么菜?
public class MyObject
{
public MyObject()
{
MyNumber = 6;
}
public int MyNumber { get; set; }
}
然后我叫它
var o = new MyObject {MyNumber = 8 };
我的号码是-6还是8
假设我也设定了这个
public int MyNumber { get; set; } = 7;
点什么菜?什么东西可以带礼物
我的号码是BR6还是BR8
8点。当执行以下行时:
var o = new MyObject {MyNumber = 8 };
将创建类型为MyObject
的对象,然后将MyNumber
的值设置为8。在后台,默认构造函数将用于创建对象。所以在MyNumber
设置为8之前,它应该是6
我刚才加的7个是什么故事
与上述情况相同。现在,我们来看一个自动属性初始值设定项(C#6中引入的特性)。以下
public int MyNumber { get; set; } = 7;
等价于在默认构造函数中初始化MyNumber
的值
如果使用以下代码创建控制台应用程序:
public class MyObject
{
public MyObject()
{
MyNumber = 6;
}
public int MyNumber { get; set; }
}
class Program
{
static void Main(string[] args)
{
var o = new MyObject { MyNumber = 8 };
}
}
然后编译代码并使用ildasm对其进行反编译,如果您查看Main的IL代码,您将看到以下图片
从带下划线的第一行可以清楚地看到,调用了默认的对象初始值设定项。然后在第二行下划线处,将8的值设置为相应的支持字段
此外,如果您为以下控制台应用程序编译代码:
public class MyObject
{
public int MyNumber { get; set; } = 8;
}
class Program
{
static void Main(string[] args)
{
var o = new MyObject { MyNumber = 8 };
}
}
您将得到完全相同的IL代码
我的号码是BR6还是BR8
8点。当执行以下行时:
var o = new MyObject {MyNumber = 8 };
将创建类型为MyObject
的对象,然后将MyNumber
的值设置为8。在后台,默认构造函数将用于创建对象。所以在MyNumber
设置为8之前,它应该是6
我刚才加的7个是什么故事
与上述情况相同。现在,我们来看一个自动属性初始值设定项(C#6中引入的特性)。以下
public int MyNumber { get; set; } = 7;
等价于在默认构造函数中初始化MyNumber
的值
如果使用以下代码创建控制台应用程序:
public class MyObject
{
public MyObject()
{
MyNumber = 6;
}
public int MyNumber { get; set; }
}
class Program
{
static void Main(string[] args)
{
var o = new MyObject { MyNumber = 8 };
}
}
然后编译代码并使用ildasm对其进行反编译,如果您查看Main的IL代码,您将看到以下图片
从带下划线的第一行可以清楚地看到,调用了默认的对象初始值设定项。然后在第二行下划线处,将8的值设置为相应的支持字段
此外,如果您为以下控制台应用程序编译代码:
public class MyObject
{
public int MyNumber { get; set; } = 8;
}
class Program
{
static void Main(string[] args)
{
var o = new MyObject { MyNumber = 8 };
}
}
您将得到完全相同的IL代码 您的声明:
var o = new MyObject {MyNumber = 8 };
相当于
因此,您将返回的结果是8
,因为分配给MyNumber
的任何值都将由于对象初始化而被覆盖
对于属性初始值设定项,结果是相同的,唯一的区别是:
- 在调用构造函数时,属性
的默认值为MyNumber
7
- 在构造函数中,它将被分配
6
- 但由于对象初始值设定项,它将被分配
8
var o = new MyObject {MyNumber = 8 };
相当于
因此,您将返回的结果是8
,因为分配给MyNumber
的任何值都将由于对象初始化而被覆盖
对于属性初始值设定项,结果是相同的,唯一的区别是:
- 在调用构造函数时,属性
的默认值为MyNumber
7
- 在构造函数中,它将被分配
6
- 但由于对象初始值设定项,它将被分配
8
在将新对象分配给类或结构字段时,有一个用例未包含在另一个答案中:
public class MyClass
{
private MyObject m;
public void MyMethod()
{
this.m = new MyObject { MyNumber = 8 };
}
}
由于该字段可能在类之外使用,并且该语句在用户看来是原子的,因此编译器将生成一个临时变量,并仅在完全初始化时为该字段赋值:
var temp = new MyObject();
temp.MyNumber = 8;
this.m = temp;
在将新对象分配给类或结构字段时,有一个用例未包含在另一个答案中:
public class MyClass
{
private MyObject m;
public void MyMethod()
{
this.m = new MyObject { MyNumber = 8 };
}
}
由于该字段可能在类之外使用,并且该语句在用户看来是原子的,因此编译器将生成一个临时变量,并仅在完全初始化时为该字段赋值:
var temp = new MyObject();
temp.MyNumber = 8;
this.m = temp;
这似乎足够简单,您可以测试…我确信这是一个副本而不是正确的副本,可能还有其他副本。您可能想阅读:如果您使用的是
自动属性初始值设定项
,请将您的标记更新为c#6.0这似乎足够简单,您可以测试…我确信这是一个副本而不是正确的副本,可能还有其他。您可能想阅读:如果您使用的是自动属性初始值设定项
,请将您的标记更新为c#6.0。这与实际提出的问题无关。如果你想评论另一个答案,那么你应该