2010-07-09 24 views

回答

4

除非你進行這樣大量的來電,昂貴性是相當微不足道我不會爲此擔心。

在我的機器上Assembly.GetEntryAssembly()第一次需要164個滴答滴答,而在調試模式下隨機運行下一個需要7個滴答滴答。沒有深入Reflector反映它似乎是緩存的呼叫。

我的機器上每秒有2597734個刻度,所以164對7仍然不重要。

+0

這取決於.NET框架是否已經緩存。可以? – 2010-07-09 09:26:26

+0

它緩存。 Assembly.GetEntryAssembly();我第一次運行它時需要164次滴答,而下一次運行時需要7次。而且我的機器上每秒有2597734個刻度,所以164對7仍然不重要。 – 2010-07-09 10:38:58

1

我不知道性能,但這是一個代碼氣味,取決於你要使用這個對象的代碼。

由於您可以通過typeof(Anything).Assembly來查找裝配體,因此您不必調用這些裝配體就能知道裝配體是什麼。關鍵字typeof可以由編譯器檢查,而GetEntryAssemblyGetCallingAssembly的結果可以讓你感到驚訝。 (例如,GetEntryAssembly可以是null。)

這將有助於瞭解此程序集需要哪些信息 - 可能有更好的方法來檢索它。

+0

OP的代碼沒有得到當前的executin程序集,它獲得了入口程序集(調用堆棧中的頂級程序集)或調用的程序集(緊挨在調用堆棧之前的程序集) – 2010-07-09 09:34:47

+0

我瞭解OP的代碼,但意圖不明確。通常你的代碼知道足夠的能夠以編譯器可以檢查的方式獲得'Assembly',也就是'typeof'。你的代碼真正知道的很少,只能調用'GetEntryAssembly'或'GetCallingAssembly'。 – 2010-07-09 09:40:08

+0

我不同意。我所有的實用程序類(例如)都被其他程序集中的各種其他類調用。有一些*我只知道在一個調用上下文中知道它的類,但對於我來說這並不是一個常態。 – 2010-07-09 09:42:17

2

除非你讓這些電話很多,我不會擔心。無論如何,你可以做出一些簡單的優化。

例如,Assembly.GetEntryAssembly()在您的進程的生命週期(對於給定的AppDomain)中不會更改,因此即使您需要訪問它,也不需要重複執行此調用。您可以將其替換爲:

private static Assembly _entryAssembly; 

private Assembly ExecutingAssembly 
{ 
    get 
    { 
    if (_entryAssembly == null) 
    { 
     _assembly = Assembly.GetEntryAssembly(); 
    } 
    return _entryAssembly 
} 

現在您不必擔心此調用的代價是多少;儘管可能作爲另一個答案評論的評論者,但也許框架實際上是爲你做的。

[注:這是故意不是線程安全的單 - 最壞的情況是,你撥打電話到Assembly.GetEntryAssembly()幾次,如果第一次訪問similtaneously幾個線程 - 不值得嘗試鎖定爲這種情況恕我直言]