7

当我使用 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。我确信这是正常的,但我想了解原因。

4

6 回答 6

21

在构造函数“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;
   // ...
}
于 2009-02-17T22:05:56.630 回答
9

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

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";
于 2009-02-17T22:14:10.340 回答
6

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

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

这等同于:

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

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

于 2009-02-17T22:06:42.667 回答
4

从技术上讲,这段代码:

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

与此代码相同:

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

这与其他人发布的内容略有不同:

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

如果您的应用程序使用多线程,这种差异至关重要。

于 2009-02-17T22:16:23.067 回答
3

看起来您正试图Age在对象的构造函数中访问。对象初始值设定项值在构造函数执行之前不会被设置。

试试这个:

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

编辑回应评论

如果您需要Age在构造函数本身中访问,那么您需要创建一个带有所需参数的显式构造函数,并使用它而不是对象初始值设定项语法。例如:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

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

        int x = Age;  // will be 29 in this example
    }
}

Person person = new Person("David", 29);
于 2009-02-17T22:05:57.567 回答
0

好吧,正如其他人所说,无参数构造函数首先被执行,因此你很困惑。

但是,我必须问一下,如果您为 Age 变量设置了字段而不是自动属性?

public class Person
{
    private int _age;

    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
 }

如果足够了,或者如果你真的需要使用,你可以使用_age而不是:xx

public class Person
{
    private int _age;
    private int x;

    public int Age
    {
        get { return _age; }
        set 
        { 
            _age = value;
            x = _age;
        }
    }
 }

哪个更合适。

于 2009-02-17T22:39:25.570 回答