Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么叫第一对象初始值设定项或构造函数?_C#_C# 6.0 - Fatal编程技术网

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。这与实际提出的问题无关。如果你想评论另一个答案,那么你应该