Используя GetCurrentMethod в (предположительно), высокоэффективном коде

В.NET 3.5, существует TimeZoneInfo , который обеспечивает большую функциональность в этой области; 2.0SP1 имеет DateTimeOffset , но это намного более ограничено.

Получение UtcNow и добавление фиксированного смещения является частью задания, но не осведомлено о DST.

Так в 3,5 я думаю, что можно сделать что-то как:

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time");

, Но это просто не существует в 2,0; извините.

6
задан Dan Tao 23 September 2009 в 15:39
поделиться

2 ответа

В вашей ситуации this.GetType () даст тот же результат, что и MethodBase.GetCurrentMethod (). DeclaringType делает. См. Ответ JaredPar для ситуации, когда оба вызова будут возвращать разные типы.

В общем случае тип, представляющий член (полученный через свойство MemberInfo.ReflectedType ), и тип, объявляющий член (полученный через свойство MemberInfo.DeclaringType ) может отличаться.

ОБНОВЛЕНИЕ

Я только что профилировал его с помощью C # - this.GetType () требуется 2,5 нс на вызовите while MethodBase.GetCurrentMethod (). DeclaringType требуется 2490 нс на вызов - так что у вас есть ускорение примерно в 1200 .

[Intel Core 2 6400 2,13 ГГц | 3,5 ГиБ | WinXP Pro SP2 | .NET FX 3.5 SP1 | Выпуск | Без отладчика]

8
ответ дан 8 December 2019 в 05:56
поделиться

Возвращает ли Me.GetType () как GetCurrentMethod (). DeclaringType?

Это зависит от ситуации. Me.GetType всегда будет возвращать фактический тип объекта. GetCurrentMethod (). DeclaringType вернет тип, в котором был объявлен метод. Эти значения могут отличаться в сценариях наследования.

Рассмотрим следующий

Class C1
  Public Sub Foo() 
    ..
  End Sub
End Class
Class C2 
  Inherits C1
  ..
End Class

Внутри метода Foo два выражения были бы равны, если бы вы имели дело с экземпляром C1. Но если бы это был C2, они были бы другими.

Делает ли Me.GetType () что-либо иначе, чем GetCurrentMethod (). DeclaringType

Да, это очень разные функции. Me.GetType определяет тип среды выполнения текущего экземпляра класса. GetCurrentMethod.DeclaringType определяет, в каком типе был объявлен этот метод.

Должен ли я вообще не беспокоиться об этом?

Если это критичный для производительности сценарий, тогда да, убедитесь, что вы профилируете API, которые не понимаете. Особенно те, которые предполагают рефлексию. Но только профилировщик скажет вам, что определенно быстрее. Но мои деньги на Me.GetType.

14
ответ дан 8 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: