2017-10-06 73 views
0

刚跑代码分析我继承的一个应用程序,并提出了类似下面的代码警告:代码分析警告有关对象废弃的潜在两次

using (StreamWriter tw = File.AppendText("Log.txt")) 
{ 
    try 
    { 
     tw.WriteLine(DateTime.Now.ToString("------------------------"); 
     tw.WriteLine(data); 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(String.Format(CultureInfo.InvariantCulture, "Error writing to the log file: {0}", ex.Message)); 
    } 
    finally 
    { 
     tw.Close(); 
    } 
} 

如果我注释掉finally块,则不会引发警告。我的印象是关闭一个流编写器只关闭底层文件,但实际上并没有处理编写器对象。代码分析是否被破解,或者我误解了应该如何使用流编写器?

在此处,代码分析抱怨两个作家的可能的部署和底层流两次又如:

using (TextReader tr = new StreamReader(File.OpenRead(filename))) 
{ 
    while (tr.ReadLine() != null) 
    { 
     counter++; 
    } 

    tr.Close(); 
} 

它抱怨都trFile.OpenRead(filename)

+0

'using'自动处理创建的实例,您不必显式调用'.Close()'或'.Dispose()'。我建议谷歌搜索,如何使用'工作 –

+0

是的,'关闭'调用'处置'。这是一个奇怪的API。 – Blorgbeard

+3

@o_O问题作者表示他们认为“Close”与处置不同,并不是“使用”不处理对象。 – Servy

回答

2

Close just calls Dispose on the object,所以是的,你处置的对象两次。 (不是两次处理对象是有问题的,只是多余的。)

+0

是的,我错过了那部分。一致性,微软?首先,他们希望我们在'使用'中包装'IDisposable',然后这个。 – ajeh

相关问题