#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[])
. Спасибо за помощь.