Анализ кода c # .NET CA1822 - PullRequest
       37

Анализ кода c # .NET CA1822

1 голос
/ 26 июня 2011

Я запускаю Анализ кода и получаю это сообщение:

CA1822: Microsoft.Performance: параметр 'this' (или 'Me' в Visual Basic) для CreateIntervalString (TimeSpan) 'никогда не бываетиспользуемый.Пометьте элемент как статический (или Shared в Visual Basic) или используйте «this» / «Me» в теле метода или, по крайней мере, один метод доступа к свойству, если необходимо.

Мой код:

private string CreateIntervalString(TimeSpan timeSpan)
{
    return timeSpan.ToString();
}

, как я понял, поскольку функция CreateIntervalString не использует членов класса и использует только входные данные timeSpan, VisualStudio рекомендует пометить его как статический.

MyВопросы:

  1. Почему , когда я отмечаю его как статическое, производительность улучшается?
  2. Моя функция является частью библиотеки, которая должна быть поточно-ориентированной,помечать как статические методы как это предотвратить?
  3. У меня есть дополнительные закрытые функции, которые используют только свои входные данные и не используют другие члены класса, но я не получаю ту же ошибку для них.

Спасибо большое!

Примеры:

следующий метод выдает ошибку:

    private string CreateIntervalString(TimeSpan timeSpan)
    { 
          return timeSpan.ToString();
    }

, а следующее:

    private DateTime ParseDateString(string dateTimeString)
    {
     // the years,monthe,days,hours,minutes and secondes found by the dateTimeString input        
      return new DateTime(years, months, days, hours, minutes, secondes);
    }

Ответы [ 4 ]

6 голосов
/ 26 июня 2011
  1. Производительность не улучшается (каким-либо образом это важно), но код становится более четким.Метод не создает впечатление, что он использует экземпляр, и вы можете использовать метод, не создавая экземпляр класса.

  2. Поскольку вы не используете экземпляр из метода, это не влияет на состояние безопасности потока.Поскольку метод использует только те данные, которые ему отправляются, он является поточно-ориентированным.

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

5 голосов
/ 28 марта 2014

Сайт MSDN http://msdn.microsoft.com/en-us/library/ms245046.aspx дает ответ на аспект производительности

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

1 голос
/ 26 июня 2011
  1. Статические функции имеют на один аргумент меньше (скрытый аргумент this), поэтому теоретически они несколько более эффективны.
  2. Безопасность потока не имеет ничего общего с тем, является ли ваш метод статическим или нет.Вы можете сделать метод экземпляра небезопасным так же легко, как статический метод.
  3. Не могли бы вы опубликовать некоторые из этих функций, чтобы мы могли их увидеть?
0 голосов
/ 26 июня 2011
  1. В большинстве случаев вы не заметите разницу в производительности между статическими и нестатическими функциями. Теоретически, тот факт, что они не могут быть виртуальными (и не выдвигать указатель «this» в качестве аргумента), делает их немного быстрее. Но опять же, не то, что вы обычно замечали бы.
  2. Статика и безопасность потоков не связаны. Если метод был потокобезопасным до «статического», он будет потокобезопасным после «статического».
  3. Я видел это раньше с некоторыми инструментами. Если дополнительные частные методы используются нестатическими методами, анализ кода будет предполагать, что их нельзя сделать статическими (даже если они не ссылаются на члены). Если вы измените другие нестатические методы на статические (если можете), то, вероятно, вы получите то же предупреждение.

Надеюсь, это поможет, John

...