這裏有兩個獨立的概念。第一個是DateTime
是一個值類型(a.k.a.一個結構),而Person
是[推測]一個引用類型(一個類)。正因爲如此,當你做:
DateTime date1 = DateTime.Now;
DateTime date2 = date1;
date2
會導致複製的價值,所以這兩個變量將不會引用同一個對象。
帶班,當你這樣做:
Person p1 = new Person();
Person p2 = p1;
p1
實際上並不包含Person
,它只是包含引用一個人。然後將該參考值(按值)複製到p2
。複製該引用的效果是兩個變量現在都「指向」或「引用」同一個對象。
接下來是可變性問題。在這種情況下,Person
是可變類型。這意味着它可以改變。另一方面,不可修改的類型一旦構建就不能改變。
線:
p2.Age = 2;
實際上正在改變p2
引用,而且由於p2
和p1
都引用相同的對象的對象,p1.Age
將2
該行代碼後。
現在,爲了演示,讓我們做一個不變Person
類:
public class Person
{
private int _age;
public Person(int someAge)
{
_age = someAge;
}
public int Age
{
get { return _age; }
}
public Person Grow()
{
return new Person(_age + 1);
}
}
如果我們做這樣的事情:
Person p1 = new Person(1);
Person p2 = p1;
p2 = p2.Grow();
第二行只是在做它之前,確保這兩個指向同一個對象,但第三行是不同的。我們的Grow
方法返回一個新的Person
對象,而不是改變(或變異)該對象使其成長一歲。這樣做後p2
和p1
將不再引用相同的對象;我剛剛更改了方法創建的新對象p2
的引用。
第二個例子與DateTime
的情況很相似。你不能改變DateTime
對象;它是不可改變的。調用它的方法(在這種情況下,加號和減號運算符)返回並且全新的對象。按照慣例,如果沒有一些令人信服的理由,值類型不應該是可變的,因爲處理它們往往是棘手的。引用類型可以是不可變的或可變的;沒有重大問題(在一般情況下)。
的DateTime是值類型,而不是一個 –
引用類型檢查這個答案 http://stackoverflow.com/a/4265417/1511796 –