2013-05-01 43 views
2

在C#什麼是String屬性GET返回?

假設我有以下幾點:

public String whatHappens{ get; set; } 

假設屬性已初始化和設置。

然後到這裏我打電話

Console.WriteLine(whatHappens); 

是否GET調用返回一個字符串對象和Console.WriteLine命令調用toString() OR 是否又將GET調用調用內的ToString()方法字符串類並返回一個字符串。

這不是一個學校的問題,這是我的同事和我有的論點。

+5

屬性getter返回對字符串對象的引用,並調用接受字符串的Console.WriteLine()的重載,並且根本不調用「ToString()」。 (請注意,編譯器會爲該類生成一個隱藏的字符串字段,以實現一個自動字符串屬性,例如您指定的字符串屬性,並且它是對從該getter返回的該隱藏字符串字段的引用。) – 2013-05-01 18:56:23

+2

您還沒有到'.ToString()'''字符串';它已經是一個'字符串'了。 – JosephHirn 2013-05-01 18:59:19

回答

7

在你的例子中你使用了一個自動屬性。自動屬性具有額外的隱藏字段,即後臺字段。這個字段與屬性的類型相同,在你的情況下是一個字符串。

此屬性內的代碼將不會調用ToString(),因爲後臺字段已經是string類型。

Console.WriteLine有許多過載。其中一個重載接受string類型的參數。因此在Console.WriteLine之內,不需要調用ToString(),因爲該參數已經是該類型的。

總之:沒有ToString()將被稱爲任何地方。

另一方面,如果該屬性不是自動屬性,並且該屬性背後的字段是另一種類型,則需要使用ToString()將其轉換爲字符串。

如果,另一方面,Console.WriteLine另一個重載叫,其中參數是object型,比WriteLine有在某些時候調用ToString()

+0

您的倒數第二個「段落」中的措詞使它聽起來像'ToString()'從不需要自動屬性。在類型不是'String'的任何情況下,都會調用ToString()。 – Cemafor 2013-05-01 19:10:30

+0

@Cemafor:任何自動屬性都不會調用任何轉換方法,因爲後臺字段總是與屬性相同。爲什麼要轉換數據,如果他們是相同類型的。這隻會消耗性能。 – 2013-05-01 19:13:19

+0

我的意思是在調用'Console.WriteLine(whatHappens);'的情況下,我想這是調用'ToString()'的問題出現的地方。 – Cemafor 2013-05-01 19:15:57

相關問題