2010-05-25 15 views
2

我想編寫一個行爲像一個值類型的'Date'類。 例如,而不是寫安全設置屬性的克隆方法,使Date類按值傳遞:爲什麼System.String會像一個值類型? (如何寫值類型類如字符串?)

public Date Birthday 
     { 
      get { return this.birthday; } 
      set 
      { 
       this.birthday = value.Clone(); 
      } //I want to write this.birthday = value; 
       //without changing external value when this.Birthday changes 
     } 

我知道這是可能的,因爲System.String是一類,並且表現得像一個值。例如:

String s1 = "Hello"; 
String s2 = "Hi"; 
s1 = s2; 
s2="Hello"; 
Console.WriteLine(s1); //Prints 'Hi' 

首先我認爲這個類重寫「=」操作的作家,但現在我知道,「=」經營者不能被重寫。那麼他們怎麼寫String類?

編輯:我只是想讓我的Date類按值傳遞它的實例,就像String一樣。

+1

你用String的例子沒有證明任何東西......結果對所有類型,參考或值都是一樣的 – 2010-05-25 12:01:27

+0

@Thomas Levesque - 我認爲這是不正確的。如果S1和S2是類,那麼輸出將是「你好」。 – 2010-05-25 12:16:24

+0

@Thomas Levesque:不!我測試它。它打印'嗨'。和System.String是一個類(我在對象瀏覽器中查找)... – 2010-05-25 12:20:16

回答

4

public class Date{ ...code...}將是一個引用類型...不是你想要的。

public struct Date { ...code...}將是一個值類型...可能是你想要的。

字符串類,因爲它是一個類,引用類型...並且是不可變的.how是不可變的效果字符串對象的行爲在開始時可能會引起混淆。

鑑於string s1 = "Fish"; s1是一個指向「魚」的參考......它是「魚」位永遠不能改變....什麼s1指向可以改變。如果您隨後分配s1 = "Tuna";「魚」仍然存在,但不再被引用並且將被GC'd。

在您的示例之後:s1=s2 s1,s2現在引用相同的字符串「Hi」...只有一個「Hi」。

我希望我沒有低於你的水平。

+0

+1,可能是最容易理解的答案 – 2010-05-25 12:55:21

+0

+ 1,謝謝。 nd說s1 = s2時發生了什麼。但爲什麼其他類有不同的行爲?例如,如果d1和d2是'Date',那麼d1 = d2不會像s1 = s2那樣做。 – 2010-05-25 12:58:29

+0

@Sorush,其他*類*(引用類型)** do **具有相同的行爲。但* structs *(值類型)具有值語義,所以如果Date是一個結構體,則d1 = d2會將d2的值複製到d1中,因此您將擁有2個Date實例。 – 2010-05-25 13:02:51

7

首先,您的基於string的示例沒有說明您的問題。

DateTimeString的事情是,他們是immutable:一旦創建一個實例,它不能以任何方式改變。例如,您只需說date.Minutes += 2就不能將2分鐘添加到DateTime實例:您必須調用date.AddMinutes(2),這將產生一個全新的實例。

要使對象爲只讀,只需遵循相同的模式。

+0

定義:不可變:「不受主體或易受形式或質量或性質的變化或變化影響; 「那時候的觀點是所有物種都是不可變的......' – 2010-05-25 12:01:55

+0

我不是指System.DateTime類,我寫了一個名爲Date的類,它的行爲是通過引用傳遞的,我想通過值傳遞它們而不改變用戶端代碼 – 2010-05-25 12:08:56

+0

使用一個結構而不是一個類然後 – thecoop 2010-05-25 12:13:08

4

它不是「=」操作,這是事實,當你說

stringThing = "thing"; 

您要創建一個新的字符串,不改變當前字符串到別的東西。

相關問題