我剛看到這行的C#代碼,我想知道如果它是昂貴的C#昂貴的方法調用? Assembly.GetEntryAssembly()和Assembly.GetCallingAssembly()
Assembly assembly = useEntryAssembly ? Assembly.GetEntryAssembly() : Assembly.GetCallingAssembly();
我剛看到這行的C#代碼,我想知道如果它是昂貴的C#昂貴的方法調用? Assembly.GetEntryAssembly()和Assembly.GetCallingAssembly()
Assembly assembly = useEntryAssembly ? Assembly.GetEntryAssembly() : Assembly.GetCallingAssembly();
除非你進行這樣大量的來電,昂貴性是相當微不足道我不會爲此擔心。
在我的機器上Assembly.GetEntryAssembly()
第一次需要164個滴答滴答,而在調試模式下隨機運行下一個需要7個滴答滴答。沒有深入Reflector反映它似乎是緩存的呼叫。
我的機器上每秒有2597734個刻度,所以164對7仍然不重要。
我不知道性能,但這是一個代碼氣味,取決於你要使用這個對象的代碼。
由於您可以通過typeof(Anything).Assembly
來查找裝配體,因此您不必調用這些裝配體就能知道裝配體是什麼。關鍵字typeof
可以由編譯器檢查,而GetEntryAssembly
和GetCallingAssembly
的結果可以讓你感到驚訝。 (例如,GetEntryAssembly
可以是null
。)
這將有助於瞭解此程序集需要哪些信息 - 可能有更好的方法來檢索它。
OP的代碼沒有得到當前的executin程序集,它獲得了入口程序集(調用堆棧中的頂級程序集)或調用的程序集(緊挨在調用堆棧之前的程序集) – 2010-07-09 09:34:47
我瞭解OP的代碼,但意圖不明確。通常你的代碼知道足夠的能夠以編譯器可以檢查的方式獲得'Assembly',也就是'typeof'。你的代碼真正知道的很少,只能調用'GetEntryAssembly'或'GetCallingAssembly'。 – 2010-07-09 09:40:08
我不同意。我所有的實用程序類(例如)都被其他程序集中的各種其他類調用。有一些*我只知道在一個調用上下文中知道它的類,但對於我來說這並不是一個常態。 – 2010-07-09 09:42:17
除非你讓這些電話很多,我不會擔心。無論如何,你可以做出一些簡單的優化。
例如,Assembly.GetEntryAssembly()
在您的進程的生命週期(對於給定的AppDomain)中不會更改,因此即使您需要訪問它,也不需要重複執行此調用。您可以將其替換爲:
private static Assembly _entryAssembly;
private Assembly ExecutingAssembly
{
get
{
if (_entryAssembly == null)
{
_assembly = Assembly.GetEntryAssembly();
}
return _entryAssembly
}
現在您不必擔心此調用的代價是多少;儘管可能作爲另一個答案評論的評論者,但也許框架實際上是爲你做的。
[注:這是故意不是線程安全的單 - 最壞的情況是,你撥打電話到Assembly.GetEntryAssembly()
幾次,如果第一次訪問similtaneously幾個線程 - 不值得嘗試鎖定爲這種情況恕我直言]
這取決於.NET框架是否已經緩存。可以? – 2010-07-09 09:26:26
它緩存。 Assembly.GetEntryAssembly();我第一次運行它時需要164次滴答,而下一次運行時需要7次。而且我的機器上每秒有2597734個刻度,所以164對7仍然不重要。 – 2010-07-09 10:38:58