gpt4 book ai didi

c# - StringWriter 未沿所有异常路径处理

转载 作者:太空狗 更新时间:2023-10-30 00:09:03 26 4
gpt4 key购买 nike

我正在使用一个 StringWriter,我将它传递给一个方法以在 foreach 循环中写入值。我相信这会导致产生两个警告:

CA2000 : Microsoft.Reliability : In method 'ToCsvService.ToCsv()', object 'sw' is not disposed along all exception paths. Call System.IDisposable.Dispose on object 'sw' before all references to it are out of scope.

CA2202 : Microsoft.Usage : Object 'sw' can be disposed more than once in method 'ToCsvService.ToCsv()'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.

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);
}
}

为什么会生成这些警告?

最佳答案

您的代码允许抛出的异常导致执行跳过关闭您的 StringWriter 的语句的可能性。您要确保在异常导致执行离开 ToCSV 之前,您关闭了 sw

处理此问题的最简单方法是使用 using block 。在 using 子句中构造的对象保证在 block 范围退出之前被释放:

public string ToCsv()
{
IEnumerable<string> props = GetProperties();
using (StringWriter sw = new StringWriter())
{
sw.WriteLine(GetHeadings(props));
WriteValues(props, sw);
return sw.ToString();
}
}

请注意,您不需要对 StringWriter 同时调用 CloseDispose。只需 Dispose 就足够了。

一般来说,您需要在创建和使用所有实现IDisposable 的对象(如StringWriter做)。这将确保无论抛出什么异常,对象总是被正确处理。

关于c# - StringWriter 未沿所有异常路径处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3783221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com