我刚看到这行C#代码,我想知道它是否很贵
Assembly assembly = useEntryAssembly ? Assembly.GetEntryAssembly() : Assembly.GetCallingAssembly();
答案 0 :(得分:4)
除非您经常进行这样的通话,否则费用相当微小,我不会担心。
在我的计算机上Assembly.GetEntryAssembly()
在调试模式下随机运行时第一次需要164个滴答,而下一个则需要7个滴答。如果没有使用Reflector潜水太深,它似乎会缓解这些电话。
我的机器上每秒有2597734个刻度,因此164对7仍然不重要。
答案 1 :(得分:2)
除非你经常打这些电话,否则我不担心。无论如何,你可以做一些简单的优化。
例如,Assembly.GetEntryAssembly()
在进程的生命周期内(对于给定的AppDomain)不会更改,因此即使您需要访问它,也不需要重复执行此调用。您可以将其替换为:
private static Assembly _entryAssembly;
private Assembly ExecutingAssembly
{
get
{
if (_entryAssembly == null )
{
_assembly = Assembly.GetEntryAssembly();
}
return _entryAssembly
}
现在你不必担心这个电话有多贵;虽然可能,作为另一个答案评论的评论者,也许框架实际上是为你做的。
[注意:这故意不是一个线程安全的单例 - 最糟糕的情况是,如果第一次被几个线程同时访问,你会调用Assembly.GetEntryAssembly()
几次 - 不值得尝试锁定这个场景IMHO]
答案 2 :(得分:1)
我不了解性能,但这取决于您将使用此Assembly
对象的代码气味。
由于你可以typeof(Anything).Assembly
找到一个程序集,你已经知道你所在的程序集没有调用它们。编译器可以检查typeof
关键字,而GetEntryAssembly
和GetCallingAssembly
的结果可能会让您感到惊讶。 (例如,GetEntryAssembly
可以是null
。)
了解您需要从此程序集中获取哪些信息会有所帮助 - 可以有更好的方法来检索它。