Отключение / исправление предупреждений анализа кода из файлов.Designer.cs
Я использую DataVisualization.Charting.Chart
экстенсивно, и по большей части это работает. Тем не менее, я часто выполняю анализ кода, и обо всех моих предупреждениях позаботились. Но в файлах *.Designer.cs, использующих диаграммы, есть около 30 CA2000 (объект расположен не по всем путям исключений). Файлы Designer генерируют практически весь код диаграммы, и почти все элементы диаграммы реализуют IDisposable
, Я установил флажок "Подавить результаты из сгенерированного кода" в настройках проекта, но он все равно делает это.
Есть ли способ исправить это, не создавая вручную объекты диаграммы и не отключая анализ кода для остальной части кода в этом классе? Есть ли способ отключить его для всех файлов.Designer.cs? Или есть решение для правильного удаления этих предупреждений, если код разработчика позаботится об их удалении?
4 ответа
Довольно немногие разработчики, кажется, столкнулись с этим без удачи, так что +1 за хороший вопрос!
Возможное решение - написать метод, который переопределяет CA2000 и подавляет правило, если предупреждение обнаруживается в файле конструктора. Вот хорошее начало:
Написание пользовательских правил анализа кода в Visual Studio 2010
В противном случае см. Комментарии в конце этой темы, упомянутые инженерами MSFT для регистрации звонка Connect: http://blogs.msdn.com/b/codeanalysis/archive/2010/03/22/what-s-new-in-code-analysis-for-visual-studio-2010.aspx
Просто добавьте [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "..."]
к Dispose
метод в вашем файле *.Designer.cs.
Я только что сделал, и я обнаружил, что VS 2012 достаточно умен, чтобы держать его там даже при переписывании файла, когда что-то было изменено в конструкторе.
Я знаю, что опоздал на это, но здесь идет.
Я предполагаю, что все эти предупреждения генерируются для кода внутри InitializeComponent
метод? Если да, то рассматривали ли вы вопрос об изменении файлов шаблонов, расположенных в папке Common7\IDE\ItemTemplates? Вы можете добавить GeneratedCode
атрибут на метод в тех. Поскольку атрибут будет установлен только для него, весь ваш другой код в том же классе все равно будет проверяться анализом кода.
Вот пример для Form
файл конструктора:
namespace $rootnamespace$
{
partial class $safeitemrootname$
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
[System.CodeDom.Compiler.GeneratedCode("Windows Form Designer generated code", "1.0.0.0"), System.Diagnostics.DebuggerNonUserCode()]
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Text = "$safeitemrootname$";
}
#endregion
}
}
Вы пытались установить значение свойства "Подавить результаты из сгенерированного кода" в значение "истина" на странице свойств анализа кода для вашего проекта? Эта опция является стандартным механизмом игнорирования проблем в сгенерированном коде.
Тем не менее, сгенерированный код - это код, который будет выполняться, поэтому игнорирование его нарушений не обязательно является хорошей идеей. Учитывая "шумность" CA2000, вы можете вместо этого рассмотреть возможность отключения правила.