2010-02-02 101 views
1

我已經讀過ToString()使用反射(雖然它應該只是在它所調用的對象周圍加上引號,所以我不知道它在哪裏/爲什麼會使用反射)。有沒有這方面的證據?是否有任何性能損失調用.ToString()(也許我應該調用Convert.ToString()?)?調用ToString()陷阱

+3

「將引號放在要調用的對象周圍」?你是什​​麼意思...我覺得這是一個錯誤的概念... – Romain 2010-02-02 15:54:33

+0

我認爲他的意思是,如果你有一個對象叫杜卡,你有杜卡D =新杜卡(); d.ToString()會返回'duka' – taylonr 2010-02-02 15:56:09

+0

@taylonr:如果是這樣的話,它肯定會*需要反射。 – 2010-02-02 16:00:53

回答

4

如果不重寫ToString()方法,你最終調用Object.ToString(),它的實現看起來是這樣的:

public virtual string ToString() 
{ 
    return this.GetType().ToString(); 
} 

[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical] 
public extern Type GetType(); 

並不是簡單地「把周圍的物體引號的方法它被稱爲上」。爲了實現這一結果,必須反思得到的運行時類型信息,並致電ToString()上,這又看起來是這樣的:

public override string ToString() 
{ 
    return ("Type: " + this.Name); 
} 

每當你經過思考的東西有一點性能的懲罰,但在這種情況下,可能不是真正重要的一個 - 除非你是在一個非常緊密,非常大的循環內進行的。

您是否看到性能問題?你試圖完成什麼,導致你想打電話給Object.ToString(),而不是調用你提供的覆蓋版本?

+0

謝謝。好的細節在你的答案+1 – duka 2010-02-02 16:48:07

+0

順便說一句,這只是一個理論問題,沒有用例。 – duka 2010-02-03 17:46:49

3

我認爲,如果你不覆蓋ToString(),它是最終使用反射。

如果您有:

public class SomeObject 
{ 
    public void SomeMethod(); 
} 

void program 
{ 
    SomeObject o = new SomeObject(); 
    Console.WriteLine(o.ToString()); 
} 

你將不得不使用反射來知道是什麼類型的對象O的。 現在,如果您重寫ToString(),您應該這樣做以獲得有意義的字符串表示形式,那麼您編寫的代碼將直接被調用,而不會反射。

+8

實際上,默認實現不使用反射。它調用標記爲InternalCall的GetType(),例如直接構建到CLR中的功能。因此,即使該代碼路徑不應該達到任何基於反射的性能損失。 – 2010-02-02 16:01:31