我已經讀過ToString()使用反射(雖然它應該只是在它所調用的對象周圍加上引號,所以我不知道它在哪裏/爲什麼會使用反射)。有沒有這方面的證據?是否有任何性能損失調用.ToString()(也許我應該調用Convert.ToString()?)?調用ToString()陷阱
1
A
回答
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()
,而不是調用你提供的覆蓋版本?
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
相關問題
- 1. rmi回調陷阱?
- 2. 陷阱
- 3. 在Windows上調度陷阱
- 4. 從MS Access的空陷阱的陷阱
- 5. 軟件陷阱vs硬件陷阱
- 6. 調用urllib.urlopen時跟蹤/ BPT陷阱
- 7. Java JIT陷阱
- 8. 春季陷阱
- 9. SetTimer()陷阱
- 10. 形式 - 陷阱
- 11. PyThreadState_SetAsyncExc陷阱?
- 12. 中止陷阱6用C
- 13. GTK#常見陷阱
- 14. 陷阱寫的RubyGems
- 15. 安卓:AlarmManager陷阱
- 16. 陷阱退格鍵
- 17. 陷阱WM_SETFOCUS消息
- 18. Singleton Design Pattern:陷阱
- 19. MySQL事務陷阱
- 20. C++模板陷阱
- 21. 陷阱os.Exit在golang
- 22. C++程序員有哪些常見的Java陷阱/陷阱?
- 23. 如何在陷阱代碼中再次設置bash陷阱?
- 24. .NET中ClickOnce /智能客戶端部署的陷阱/陷阱
- 25. 使用Rails和ActiveMerchant進行定期結算:最佳實踐,陷阱,陷阱?
- 26. iPhone店面形象(陷阱?)
- 27. 澄清的bash陷阱
- 28. 擺好陷阱錯誤CMD
- 29. ValueConstraintError在pysnmp陷阱接收
- 30. jQuery&ASP.Net資源&陷阱
「將引號放在要調用的對象周圍」?你是什麼意思...我覺得這是一個錯誤的概念... – Romain 2010-02-02 15:54:33
我認爲他的意思是,如果你有一個對象叫杜卡,你有杜卡D =新杜卡(); d.ToString()會返回'duka' – taylonr 2010-02-02 15:56:09
@taylonr:如果是這樣的話,它肯定會*需要反射。 – 2010-02-02 16:00:53