C#使用明确配置

时间:2016-09-23 14:09:01

标签: c# dispose clear using

我正在审查一些C#代码,因为我使用过C#已经有一段时间了,所以我想确保我的直觉是正确的。在这段代码中,我看到了一个使用块内的一些地方,完成了以下内容:

using(StreamWriter thing = new StreamWriter()) {

    DataSet DS = SQLQueryMethod();
    do stuff to DS and log that stuff to the a log file using thingy...

    DS.clear();
    DS.Dispose();
}

现在,我已经对此进行了一些研究,并且通过我失败的记忆回顾了几年,我认为有很多方法可以做得更好。我想知道哪种方式更“标准”/“最佳”。我认为下面的第1号是最好的方法。

提前感谢。

  1. 将DataSet添加到using语句中,以便在using语句范围的末尾自动处理它,从而无需clear和dispose。我会这样做:

    using(StreamWriter thing = new StreamWriter(), DataSet DS = new DataSet()) {
    
        DS = SQLQueryMethod()
        do stuff to DS{...}
    
    }
    
  2. 只需在DataSet DS上调用dispose,因为我认为在处置之前清除它是没用的。

  3. 实际上有必要以原始方式进行。

2 个答案:

答案 0 :(得分:6)

多个“using statement”可以使用如下:

using (StreamWriter thing = new StreamWriter())
using (DataSet DS = new DataSet())
{
    DS = SQLQueryMethod();
    //do stuff ....
} 

因为StreamWriter和DataSet在IDisposable接口中实现了所需的Dispose()方法,所以之后不需要显式调用它

答案 1 :(得分:0)

正确的方法是配置实现IDisposable的所有东西 - 比如

using (var thing = new StreamWriter())
using (var ds = SQLQueryMethod())
{
    do stuff to DS {}
} 

其他建议的答案是错误的

using(StreamWriter thing = new StreamWriter())
using(DataSet DS = new DataSet()) 
{
  // this won't compile - DS is in using so it is a read-only variable
  DS = SQLQueryMethod()
  do stuff to DS{...}
} 

参考:Why is a variable declared in a using statement treated as readonly?