Когда я выбираю Analyze> RUn Code Analysis для решения в Visual Studio 2013, я получаю: «CA2202 Не располагайте объекты несколько раз. Объект« fs »может быть удален более чем один раз в методе« RoboReporterSQL.SaveReportDataToDB (строка, строка) .. Чтобы избежать генерации System.ObjectDisposedException не следует вызывать Dispose больше, чем один раз на объекте "Должен ли я прислушаться к этому поверхностно бессмысленному предупреждению анализа кода?
указанная строка кода:
fs.Close();
А вот код в контексте:
internal static void SaveReportDataToDB(string filename, string
RESTFilename)
{
if (RecordAlreadyExists(RESTFilename)) return;
string EXCEL_FILE = "application/vnd.ms-excel";
DateTime begDate =
RoboReporterConstsAndUtils.GetBeginDate(RESTFilename);
DateTime endDate =
RoboReporterConstsAndUtils.GetEndDate(RESTFilename);
var fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
br.Close();
fs.Close();
using (var sqlConn = new SqlConnection(CPSConnStr))
{
var insertStr = "INSERT INTO ReportsGenerated (FileBaseName,
ContentType, BinaryData, BeginDate, EndDate) " +
"VALUES (@FileBaseName, @ContentType,
@BinaryData, @BeginDate, @EndDate)";
using (var insertRptsGenerated = new SqlCommand(insertStr))
{
insertRptsGenerated.Connection = sqlConn;
insertRptsGenerated.Parameters.Add("@FileBaseName",
SqlDbType.VarChar, 100).Value = RESTFilename;
insertRptsGenerated.Parameters.Add("@ContentType",
SqlDbType.VarChar, 50).Value = EXCEL_FILE;
insertRptsGenerated.Parameters.Add("@BinaryData",
SqlDbType.Binary).Value = bytes;
insertRptsGenerated.Parameters.Add("@BeginDate",
SqlDbType.DateTime).Value = begDate;
insertRptsGenerated.Parameters.Add("@EndDate",
SqlDbType.DateTime).Value = endDate;
sqlConn.Open();
insertRptsGenerated.ExecuteNonQuery();
}
}
}
Таким образом, предупреждение утверждает, что FileStream закрывается дважды, если я вызываю «fs.Close();»
Хотя я не опровергаю это с уверенностью, я сомневаюсь в этом, потому что я не вижу, чтобы он был закрыт.
В конце концов, он не находится в «используемом» блоке, так как он закрывается?
Вопрос: должен ли я действительно удалить эту строку кода ("fs.Close();")?
Примечание: решар не проклинал [g] e whit about this - с помощью «fs.Close();» в или из, он не поднимает никаких предупреждающих знаков в любом случае.
Вы закрываете его дважды. Вы закрываете его при закрытии BinaryReader - он также закрывает базовый поток. И вы действительно должны использовать –
. Это обсуждается с смертью на SO, и только ваша репутация сохраняет вопрос ... –
Мне интересно, если формулировка ошибки в этом случае. Если закрытие «BinaryReader» может привести к удалению «FileStream», доступ к методу «Закрыть» объекта, который может быть удален, может вызвать «ObjectDisposedException». –