2012-04-28 48 views
4

這是一個家庭作業的問題,這就是爲什麼它可能是有點怪(也道歉,如果標題不是很好)C#值類型和字符串

假設V1類型的值類型X重新定義的ToString,是使用有任何區別Console.WriteLine(V1)和Console.WriteLine(v1.toString())

+3

你試過了,看看它給了你什麼嗎? – 2012-04-28 12:09:03

+0

這是一個詭計問題嗎? toString不是有效的C#方法。在C#中,它是ToString,所以答案是肯定的,這是有區別的。 – bugfixr 2012-04-28 12:20:08

+2

預計課程不會涵蓋C#的這些微妙點。 – CodesInChaos 2012-04-28 12:20:25

回答

11

最簡單的答案是「是的,有區別」。顯然重要的是你知道。我不會告訴你,但我會告訴你如何進行調查...

  • 編寫一個簡短的程序,它包含所描述的自定義值類型,既Console.WriteLine(v1)Console.WriteLine(v1.ToString())Main方法
  • 編譯程序
  • 運行ildasm(或反射器中IL模式),並期待在方法調用
    • 哪種方法過載在每種情況下被調用之間的差異?
    • 每種情況下的價值會發生什麼變化?

問題,你可能要考慮和可能讓你加分:如果你使用自定義類,而不是一個結構的

  • 有什麼區別?
  • 你能想到Console.WriteLine的設計可以消除你注意到的任何效率低下嗎?
+6

如果他會告訴教授。我相信他會看看他的臉.. :) – 2012-04-28 12:13:05

+0

+1好回答:) – 2012-04-28 12:44:01

1

關於裝箱有一個小的區別,但對於ToString的正常實現它不會改變程序的可觀察行爲(超出最小性能命中)。你應該弄清楚什麼時候出現拳擊。

是否通過v1Console.WriteLine框呢?

是否打電話v1.ToString()方框v1?爲什麼/爲什麼不?是否重寫ToString?即從Object繼承的調用方法與重寫的方法之間是否有區別?

+0

示例程序,展現出一個可觀察的區別:http://ideone.com/p1omq(注意它的ToString實現是邪惡,不要在真正的代碼中做到這一點) – CodesInChaos 2012-04-28 12:48:09

0

不知道它的確定回答功課的問題,因爲這感覺就像我做你一個DIS服務:)

當沒有一個ToString調用Console.Writeline(V1)()方法將導致控制檯也可以撥打ToString()以獲得實際價值。另外,我不確定你的教授是不是一個「技巧問題」的人,但在C#中,沒有「toString()」方法 - 它實際上是「ToString()」(注意用戶大寫「To」)