ループ内StringWriter
に値を書き込むためにメソッドに渡すaを使用しています。foreach
これにより、次の2つの警告が発生していると思います。
CA2000:Microsoft.Reliability:メソッド'ToCsvService.ToCsv()'では、オブジェクト'sw'がすべての例外パスに沿って配置されているわけではありません。オブジェクトへのすべての参照がスコープ外になる前に、System.IDisposable.Dispose onobject'sw'を呼び出します。
と
CA2202:Microsoft.Usage:オブジェクト'sw'は、メソッド'ToCsvService.ToCsv()'で複数回破棄できます。System.ObjectDisposedExceptionの生成を回避するには、オブジェクトに対してDisposeを複数回呼び出さないでください。
public string ToCsv()
{
IEnumerable<string> props = GetProperties();
StringWriter sw = new StringWriter(); // first warning here
sw.WriteLine(GetHeadings(props));
WriteValues(props, sw);
sw.Close();
string returnCsv = sw.ToString();
sw.Dispose(); // second warning here
return returnCsv;
}
GetProperties()
適切ではないように思われたため、呼び出されたメソッドのリストから除外しました。
private string GetHeadings(IEnumerable<string> props)
{
string headings = String.Join(",",
props.Select(prop =>
_headings.ContainsKey(prop) ? _headings[prop] : prop));
return headings;
}
private void WriteValues(IEnumerable<string> props, StringWriter sw)
{
foreach (object obj in _collection)
{
var x = obj.GetType().GetProperties()
.Where(pi => props.Contains(pi.Name))
.Select(pi =>
_format.ContainsKey(pi.Name)
? String.Format("{0:" + _format[pi.Name] + "}",
pi.GetGetMethod().Invoke(obj, null))
: pi.GetGetMethod().Invoke(obj, null).ToString());
string values = String.Join<string>(",", x);
sw.WriteLine(values);
}
}
これらの警告が生成されるのはなぜですか?