CA2000 Microsoft.Ошибка надежности при запуске StyleCop с VS2010

#c# #visual-studio #visual-studio-2010 #stylecop

#c# #visual-studio #visual-studio-2010 #stylecop

Вопрос:

С помощью этого файла напишите код,

 try
{
    FileStream aFile = new FileStream(doFilePath, FileMode.OpenOrCreate);
    StreamWriter sw = new StreamWriter(aFile);
    sw.WriteLine(templateString, fileNameList, topLevelTestbench);
    sw.Close();
}
catch (IOException e)
{
    Console.WriteLine("An IO exception has been thrown! {0}", doFilePath);
    Console.WriteLine(e.ToString());
    Console.ReadLine();
    return;
}
  

У меня есть это сообщение об ошибке со StyleCop.

 Error   6   CA2000 : Microsoft.Reliability : 
In method 'DoFile.Generate(string, string, string)', call System.IDisposable.Dispose
on object 'aFile' before all references to it are out of scope.
  

Что может быть не так с кодом?

ДОБАВЛЕНО

Я снова получил ошибку от StyleCop при использовании метода Format без информации о культуре. Наличие этого кода заставило его работать.

 using System.Globalization;

try  
{   
    string line = String.Format(CultureInfo.InvariantCulture, templateString, fileNameList, topLevelTestbench);   
    File.AppendAllText(doFilePath, line); 
}  
catch (IOException e)            
{
    Console.WriteLine("An IO exception has been thrown! {0}", doFilePath); 
    Console.WriteLine(e.ToString()); 
}
  

Ответ №1:

Это предупреждает вас о том, что вы создаете экземпляр, IDisposable который используется только с этой функцией, и не вызывает ее должным образом Dispose . Это связано с вашим использованием FileStream экземпляра. Правильный способ устранить это — использовать using блок

 using (FileStream aFile = new FileStream(doFilePath, FileMode.OpenOrCreate)) {
  StreamWriter sw = new StreamWriter(aFile);
  sw.WriteLine(templateString, fileNameList, topLevelTestbench);
  sw.Close();
}
  

Редактировать

Примечание: Гораздо более простой способ сделать это — использовать File.AppendAllText .

 try 
{
  var line = String.Format(templateString, fileNameList, topLevelTestbench);
  File.AppendAllText(doFilePath, line);
} 
catch (IOException e)
{
  ...
}
  

Комментарии:

1. С помощью кода using я получил Microsoft. Ошибка использования со следующим сообщением об ошибке: «Ошибка 6 CA2202: Microsoft. Использование: Объект ‘aFile’ может быть удален более одного раза в методе ‘DoFile. Генерировать(строка, string, string)’. Чтобы избежать создания системы. Исключение ObjectDisposedException вы не должны вызывать Dispose более одного раза для объекта.: Строк: 160 C:DoFile.cs 160 ModelsimCommunicator».

2. @prosseek звучит так, как будто вы, возможно, столкнулись с правилом FxCop, которое путает шаблон dispose FileStream и StreamWriter . Я отредактировал свой ответ и предложил другой подход, который позволяет полностью избежать этого.

3. Мне нужно было использовать String.Format Method (IFormatProvider, String, Object[]) . Спасибо за помощь.