Отключение/исправление кода Анализ предупреждений из файлов .Designer.cs
Я использую DataVisualization.Charting.Chart
экстенсивно, и по большей части он работает. Тем не менее, я часто выполнял анализ кода и заботился обо всех моих собственных предупреждениях. Но в файлах *.Designer.cs, содержащих диаграммы, имеется около 30 CA2000 (объект, не расположенный по всем путям исключений). Файлы Designer генерируют практически весь код диаграммы, и почти все элементы диаграммы реализуют IDisposable
. У меня есть "Подавить результаты от сгенерированного кода", проверенный в настройках проекта, но он все еще делает это.
Есть ли способ исправить это, без необходимости вручную создавать объекты диаграммы и без отключения анализа кода для остальной части кода в этом классе? Есть ли способ отключить его для всех файлов .Designer.cs? Или, есть ли решение правильно удалить эти предупреждения, сделав код дизайнера заботой об удалении?
Ответы
Ответ 1
Похоже, что немногие разработчики столкнулись с этим без везения, поэтому +1 для хорошего вопроса!
Возможное решение - написать метод, который переопределяет CA2000 и подавляет правило, если предупреждение обнаружено в файле конструктора, здесь хороший старт:
Написание правил анализа пользовательского кода в Visual Studio 2010
В противном случае см. комментарии в конце этого потока, инженеры MSFT отмечают, что для входа в Connect Connect: http://blogs.msdn.com/b/codeanalysis/archive/2010/03/22/what-s-new-in-code-analysis-for-visual-studio-2010.aspx
Ответ 2
Я знаю, что опаздываю на это, но здесь идет.
Я предполагаю, что эти предупреждения испускаются для кода в методе 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
}
}
Ответ 3
Просто добавьте [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "..."]
в метод Dispose
в файле *.Designer.cs.
Я только что сделал, и я узнал, что VS 2012 достаточно умен, чтобы держать его там даже при перезаписи файла, когда что-то было изменено в дизайнере.
Ответ 4
Вы пытались переключить значение свойства "Подавить результаты сгенерированного кода" на значение true на странице свойств анализа кода для ваших проектов? Этот параметр является стандартным механизмом для игнорирования проблем в сгенерированном коде.
Тем не менее, сгенерированный код - это код, который будет выполнен, поэтому игнорирование его нарушений не обязательно является отличной идеей. Учитывая "шумность" CA2000, вы можете подумать об отключении этого правила.