簡體   English   中英

C#屬性引用類型?

[英]C# Property reference type?

我從C#開始,我有一個問題。

說我有一個對象:

Person

以及名為Cat的人物:

Person.Cat

如果我做:

Cat cat = new Cat(stuff);
cat.Name = "Alan";
Person.Cat = cat;

貓是貓直接參考嗎? 如果我做:

Person.Cat.Name = "John";

貓的名字會是“約翰”嗎?

因為我覺得我之前嘗試過這樣的事情,並且我得到了NullReferenceException或類似的東西。

如果'cat'是一個類,即一個引用類型,那么該引用的副本將存儲在person.Cat中。 這意味着對'cat'屬性的更改將反映在person.Cat中。 但是,由於它是原始引用的副本,因此行為如下:

Cat cat = new Cat(stuff);
cat.Name = "Alan";
Person.Cat = cat;
cat.Name = "Will";  //Person.Cat.Name is now "Will"
cat = new Cat(stuff);
cat.Name = "Greg";  
// Person.Cat is still named "Will".  
// The original reference now points  to a different object on the heap than does Person.Cat.

如果Cat是一個值類型,那么副本是在賦值時生成的,一個中的更改不會反映在另一個中(當然,一個struct可以有一個引用類型屬性或公共字段,但你明白了)。

這是正確的,假設您的完整代碼是這樣的:

// Person class.
public class Person {

    // Automatic property.
    public Cat Cat { get; set; }

}

// Cat class (not a struct!).
public class Cat {

    // Automatic property.
    public string Name { get; set; }

}

在這種情況下,訪問myPerson.Cat將直接引用該對象。 您可以在其上調用方法,訪問其屬性,將其傳遞給接受Cat參數的方法,無論您喜歡什么。

但是,在這種情況下,您無法確定myPerson.Cat屬性不為null 任何代碼都可以將其設置為Cat類型的任何對象,或者為null 如果某些內容將其設置為null並且您嘗試訪問myPerson.Cat.Name ,則會收到NullReferenceException

為了避免獲得這些異常,在使用它之前,應始終通過顯式檢查(如if (myPerson.Cat != null) { ... }來驗證該屬性是否為null。 如果您確定它永遠不會為null ,並且沒有任何內容可以違反此假設,則可以跳過此步驟。 您可能希望在使用該語言時考慮使用代碼合同來確保將來這一點。

貓是貓直接參考嗎?

是。 例如:

var cat = new Cat(stuff);
cat.Name = "Alan";
Person.Cat = cat;
cat.Name = "George";
var nowCalledGeorge = Person.Cat.Name;

所以這個問題的答案

貓的名字會是“約翰”嗎?

是是的。

暫無
暫無

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

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