2016-07-28 11 views
2

Я работаю с пользовательским RuleSet, в котором CA1822 включен как ошибка.CA1822 неверно применяется к [TestMethod] async Методы задачи в режиме выпуска?

У меня есть TestMethod, то есть async, поэтому он возвращает задачу. Этот метод не использует никаких полей, поэтому в коде Analysis flags используется правило CA1822, отмечайте его как статическое. Но MSTest не может вызвать статический асинхронный метод Task (не указан в тестовом проводнике). Таким образом, это кажется ошибкой в ​​логике анализа кода. Я довольно новичок в C#, поэтому я стараюсь следовать анализу кода как можно лучше, подавляя подавление, когда мне кажется, что я должен нарушать правила. Но это первый раз, когда я понял, что правило просто неверно.

[TestMethod] 
public async Task TestMethod1() 
{ 
    await Task.Delay(10); 
} 



Severity Code Description Project File Line Suppression State 
Error CA1822 The 'this' parameter (or 'Me' in Visual Basic) of 'UnitTest1.TestMethod1()' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate. 

Я пропустил что-то с правилом? Или это как раз достаточно угла случай, что он не был протестирован?

Попробуйте еще несколько условий, это только кажется проблемой в режиме выпуска. В режиме отладки он никогда не помещает CA1822. Если мой метод testMethod не является асинхронным, тогда правило никогда не применяется в режиме отладки или выпуска.

Так что, я думаю, это должно быть в студии 2015 RC2 студии.

Что мне кажется, что это угловой случай в RuleSet, но я хотел бы услышать, что думают другие люди.

+1

Отладка и выпуск генерируют несколько иной код. Если вам действительно интересно - посмотрите на IL код выпуска и посмотрите, как метод переписан для 'async' - вероятно, вы обнаружите, что в релизе нет использования' this'. (Было бы довольно интересной информацией, чтобы обеспечить себя как самозахват) –

+0

Я думаю, что вы на что-то, но я недостаточно понимаю этого, чтобы получить его. Рассматривая различия для debug и release IL, debug extends object, в то время как релиз расширяет ValueType. Более конкретно, при отладке мой [TestMethod] находится в классе ClassTestProject4.UnitTest1, но в режиме выпуска он является valueetype UnitTestProject4.UnitTest1. Я не совсем понимаю последствия, но думаю, что вы правы, что это ключевое различие. –

ответ

0

Правило взято из набора производительности, и с точки зрения производительности было бы быстрее сделать правило статическим. Может быть 1000 причин, это единичный метод тестирования, в этом случае один из них, что может привести к тому, что вы не будете применять это правило.

Я лично отключил это правило для большинства проектов. Во многих случаях это приводит к плохому объектно-ориентированному дизайну, даже если он выполняется немного быстрее. Небольшое замечание из документов:

В некоторых случаях отказ в доступе к экземпляру текущего объекта представляет собой проблему корректности.

В целом это более правильное замечание, хотя в этом случае оно не применяется.