[英]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.