当前位置:  开发笔记 > 编程语言 > 正文

我用C#对象初始化器做错了什么?

如何解决《我用C#对象初始化器做错了什么?》经验,为你挑选了3个好方法。

当我使用C#中的新对象初始化器初始化对象时,我不能使用类中的一个属性来执行进一步的操作,我不知道为什么.

我的示例代码:

Person person = new Person { Name = "David", Age = "29" };

在Person类中,x将等于0(默认值):

public Person()
{
  int x = Age; // x remains 0 - edit age should be Age. This was a typo
}

然而,person.Age确实等于29.我确信这是正常的,但我想明白为什么.



1> Scott Langha..:

在构造函数'public Person()'运行完毕后,为Name和Age设置属性.

Person person = new Person { Name = "David", Age = "29" };

相当于

Person tempPerson = new Person()
tempPerson.Name = "David";
tempPerson.Age = "29";
Person person = tempPerson;

所以,在构造函数中,Age还不会变成29.

(tempPerson是一个你在代码中看不到的唯一变量名,它不会与以这种方式构造的其他Person实例冲突.tempPerson是避免多线程问题所必需的;它的使用确保新对象不会成为可用于任何其他线程,直到构造函数执行完毕并且所有属性都已初始化之后.)


如果您希望能够在构造函数中操作Age属性,那么我建议您创建一个以年龄为参数的构造函数:

public Person(string name, int age)
{
   Name = name;
   Age = age;

   // Now do something with Age
   int x = Age;
   // ...
}



2> yfeldblum..:

请注意,作为重要的技术细节,:

Person person = new Person { Name = "David", Age = "29" };

相当于:

Person <>0 = new Person(); // a local variable which is not visible within C#
<>0.Name = "David";
<>0.Age = "29";
Person person = <>0;

但不等同于:

Person person = new Person();
person.Name = "David";
person.Age = "29";



3> Marc Gravell..:

您的代码行与以下内容相同:

Person person = new Person() { Name = "David", Age = "29" };

这与:

Person person = new Person();
person.Name = "David";
person.Age = "29";

如你看到的; 当构造函数执行时,Age尚未设置.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有