C# 使用更好吗?

C# 使用更好吗?,c#,syntax,C#,Syntax,可能重复: 我的问题是:使用使用(a){do something with a}是否比声明“a”并以这种方式使用要好。ie:更安全、更快 请参见示例以进行说明 例1:(不使用) StreamWriter软件; 弦线; sw=新的StreamWriter(“D:\\NewCon.xml”); 西南书写线(“”); 西南书写线(“”); 对于(int i=0;i>=36;i++) { 第“”行; 第“”行; 行+=VAL[i]; 行+=“”; 西南写入线(行); } 西南书写线(“”); sw.C

可能重复:

我的问题是:使用
使用(a){do something with a}
是否比声明“a”并以这种方式使用要好。ie:更安全、更快

请参见示例以进行说明

例1:(不使用)

StreamWriter软件;
弦线;
sw=新的StreamWriter(“D:\\NewCon.xml”);
西南书写线(“”);
西南书写线(“”);
对于(int i=0;i>=36;i++)
{
第“”行;
第“”行;
行+=VAL[i];
行+=“”;
西南写入线(行);
}
西南书写线(“”);
sw.Close();
sw.Dispose();
例2:(使用)

字符串行;
使用(sw=newstreamwriter(“D:\\NewCon.xml”))
{
西南书写线(“”);
西南书写线(“”);
对于(int i=0;i>=36;i++)
{
第“”行;
第“”行;
行+=VAL[i];
行+=“”;
西南写入线(行);
}
西南书写线(“”);
}
使用(a){用a做某事}

这意味着当代码块使用完成时,程序将调用a.Dispose。您知道,即使在发生异常的情况下,也会调用Dispose。它基本上在做:

var a = IDisposable_Something;
try{.....}finally{a.Dispose();}
它是否更安全…不是真的,但这不是重点。它的目的是确保需要清理的资源在程序完成后立即清理完毕

因此,第一个示例的问题是,如果在某个地方抛出异常,它将无法进入
Dispose()
方法。第二份遗嘱。如果存在Dispose,您总是希望确保它被调用,因为有可能IDisposable类没有被正确写入,并且即使没有调用
Dispose()
,它也没有确保清理非托管资源的代码(这通常在终结器中完成)

我所见过的唯一一次使用WCF服务代理(您可以解决这个问题)实现可能很棘手的情况。存在一个错误,如果代理有时抛出异常,它将在
Dispose()
方法中引发另一个异常


除此之外,您通常应该尝试将IDisposable对象放在using语句中。

它更安全,因为您不会忘记处置资源,特别是在出现异常的情况下(您的代码目前没有捕获任何异常)

由于使用更少的代码行,代码的意图变得更加清晰,因此它更加简洁和惯用

因此:

StreamWriter sw;
try
{
sw = new StreamWriter("D:\\epkDATA\\NewCon.xml");
...
}
finally 
{
 sw.Dispose();
}
相当于:

using(StreamWriter sw = new StreamWriter("D:\\epkDATA\\NewCon.xml"))
{
 ...
}

如果在第一个示例中引发异常,则不会释放资源


使用
使用
可以确保即使在抛出异常时也会释放资源。

首先,示例1中的代码应该包装在try/finally块中,以便在功能上与示例2中的代码等效


也就是说,我一直喜欢对这样的代码“使用”块。我认为这通常会导致更可读的代码。就安全性或性能而言,如果您在第一个示例中使用try/finally块,您将不会看到示例1和示例2之间有多大区别

使用
使用
更安全,因为即使出现任何错误或意外退出,您也可以保证在使用(…)大括号中声明的资源释放。

添加到前面的答案中,最重要的是,如果发生异常,则可以保证调用
dispose()

示例1永远不应该执行。如果抛出异常,您的
Dispose()
调用将永远不会发生,这可能是不好的<代码>使用
保证执行
Dispose()
。除了使用
之外,示例1唯一的好选择是:

var iDisposableObject = new YourDisposableConstructor();
try
{
    // some code
}
finally
{
    iDisposableObject.Dispose();
}

如果ClassA继承自IDisposing,“使用”模式等于:

IDisposable iDisposableObject = new YourDisposableConstructor();
try
{
    // some code
}
finally
{
    iDisposableObject.Dispose();
}

因此,我们最好在点击“加载新答案”之前,使用与我在“你的答案”框中几乎完全相同的使用模式。

非常好的答案,谢谢你为我清理了这个问题!
var iDisposableObject = new YourDisposableConstructor();
try
{
    // some code
}
finally
{
    iDisposableObject.Dispose();
}
IDisposable iDisposableObject = new YourDisposableConstructor();
try
{
    // some code
}
finally
{
    iDisposableObject.Dispose();
}