Я использую .net и должен получить некоторый текст html, поэтому я решил использовать HtmlTextWriter и StringWriter вместе, чтобы получить хорошо сформированный html. Но, несмотря на всевозможные способы написания кода, я все еще получаю предупреждения от анализатора статического кода (с использованием всех правил Microsoft). В приведенных ниже примерах кода я показываю предупреждение анализатора кода в комментарии. Чтобы упростить код, я фактически не делаю никаких вызовов в HtmlTextWriter (вы увидите комментарий к этому эффекту в каждой функции). Как я могу правильно написать код, чтобы избежать предупреждений?Как использовать StringWriter и HtmlWriter вместе без предупреждений анализа кода
// CA2000 : Microsoft.Reliability : In method 'Default.Func1()', object 'stringWriter' is not disposed along all exception paths. Call System.IDisposable.Dispose on object 'stringWriter' before all references to it are out of scope.
public static string Func1()
{
string html;
StringWriter stringWriter;
using (var writer = new HtmlTextWriter(stringWriter = new StringWriter()))
{
// You would do some stuff with the writer here, but not for this example.
html = stringWriter.ToString();
}
return html;
}
// CA2202 : Microsoft.Usage : Object 'stringWriter' can be disposed more than once in method 'Default.Func2()'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.: Lines: 45
public static string Func2()
{
string html;
StringWriter stringWriter = null;
try
{
using (var writer = new HtmlTextWriter(stringWriter = new StringWriter()))
{
// You would do some stuff with the writer here, but not for this example.
html = stringWriter.ToString();
}
}
finally
{
if (stringWriter != null)
stringWriter.Dispose();
}
return html;
}
// CA2202 : Microsoft.Usage : Object 'stringWriter' can be disposed more than once in
// method 'Default.Func3()'. To avoid generating a System.ObjectDisposedException
// you should not call Dispose more than one time on an object.: Lines: 61
public static string Func3()
{
string html;
using (var stringWriter = new StringWriter())
{
using (var writer = new HtmlTextWriter(stringWriter))
{
// You would do some stuff with the writer here, but not for this example.
html = stringWriter.ToString();
}
}
return html;
}
// CA2202 : Microsoft.Usage : Object 'stringWriter' can be disposed more than once in
// method 'Default.Func4()'. To avoid generating a System.ObjectDisposedException you
// should not call Dispose more than one time on an object.: Lines: 77
public static string Func4()
{
string html;
using (StringWriter stringWriter = new StringWriter())
{
using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
{
// You would do some stuff with the writer here, but not for this example.
html = stringWriter.ToString();
}
}
return html;
}
// CA2202 : Microsoft.Usage : Object 'stringWriter' can be disposed more than once in
// method 'Default.Func5()'. To avoid generating a System.ObjectDisposedException you
// should not call Dispose more than one time on an object.: Lines: 100
public static string Func5()
{
string html;
StringWriter stringWriter = null;
try
{
stringWriter = new StringWriter();
using (HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter))
{
// You would do some stuff with the writer here, but not for this example.
html = stringWriter.ToString();
}
}
finally
{
if (stringWriter != null)
stringWriter.Dispose();
}
return html;
}
много интересных комментариев по поводу [CA2202] (http://msdn.microsoft.com/en-us/library/ms182334.aspx) на MSDN –
К сожалению ни один из комментариев в Ссылка CA2202 выше рассмотрела предупреждение с этой конкретной парой классов, когда я их пробовал. –
В [другом посте] (http://stackoverflow.com/questions/3831676/ca2202-how-to-solve-this -case), Ханс Питер пишет: «Это не совсем реальные ошибки, эти классы .NET устойчивы к несколько вызовов Dispose(). " Имея это в виду, у меня возникает соблазн сделать двойное использование, как Func3 или Func4, и подавить предупреждение CA2202. –