C # Дорогие вызовы методов?Assembly.GetEntryAssembly () и Assembly.GetCallingAssembly () - PullRequest
4 голосов
/ 09 июля 2010

Я только что увидел эту строку кода C #, и мне интересно, если это дорого

Assembly assembly = useEntryAssembly ? Assembly.GetEntryAssembly() : Assembly.GetCallingAssembly();

Ответы [ 3 ]

4 голосов
/ 09 июля 2010

Если вы не будете часто выполнять такие звонки, дороговизна будет ничтожна, и я бы об этом не беспокоился.

На моей машине Assembly.GetEntryAssembly() берет 164 тика в первый раз и 7 - при случайном запуске в режиме отладки. Не вдаваясь слишком глубоко в Reflector, он, кажется, кеширует вызовы.

На моей машине 2597734 тиков в секунду, поэтому 164 против 7 все еще не важны.

2 голосов
/ 09 июля 2010

Если вы не будете часто звонить, я бы не волновался.В любом случае, есть несколько простых оптимизаций, которые вы можете сделать.

Например, Assembly.GetEntryAssembly() не изменится в течение времени жизни вашего процесса (для данного домена приложения), поэтому нет необходимости делать этозвоните повторно, даже если вам нужен доступ к нему.Вы можете заменить его на:

private static Assembly _entryAssembly;

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

Теперь вам не нужно беспокоиться о том, насколько дорог этот звонок;хотя, возможно, как комментирует другой ответ, может быть, фреймворк на самом деле делает это для вас.

[примечание: это намеренно не безопасный поток, синглтон - в худшем случае вы делаете вызов1009 * несколько раз, если сначала к ним подобным образом обращается несколько потоков - не стоит пытаться заблокировать для этого сценария ИМХО]

1 голос
/ 09 июля 2010

Я не знаю о производительности, но запах кода зависит от того, для чего вы собираетесь использовать этот объект Assembly.

Поскольку вы можете сделать typeof(Anything).Assembly, чтобы найти сборку, вы уже знаете, в какой сборке вы находитесь, не вызывая их. Ключевое слово typeof может быть проверено компилятором, тогда как результаты GetEntryAssembly и GetCallingAssembly могут вас удивить. (Например, GetEntryAssembly может быть null.)

Было бы полезно узнать, какая информация вам нужна из этой сборки - мог бы быть лучший способ получить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...