簡體   English   中英

C#對象初始化程序在做什么?

[英]What am I doing wrong with C# object initializers?

當我使用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。我確定這是正常的,但我想了解原因。

在構造函數“ 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屬性,那么建議您創建一個以age作為參數的構造函數:

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

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

請注意,作為重要的技術細節,它:

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";

您的代碼行與:

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

等同於:

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

如你看到的; 構造函數執行時,尚未設置Age

從技術上講,此代碼:

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;

如果您的應用程序使用多線程,則此區別至關重要。

似乎您正在嘗試在對象的構造函數中訪問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);

好吧,就像其他人所說的那樣,無參數構造函數首先被執行,因此是您的難題。

但是,我確實要問,是否為Age變量設置了字段而不是自動屬性?

public class Person
{
    private int _age;

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

你可以使用_age ,而不是x ,如果這就夠了,或者如果你真的需要使用x

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

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

哪個更合適。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM