我什么时候需要为一次性元素使用`using`语句?

时间:2018-01-30 21:10:03

标签: c# dispose

我知道在下面的案例中,using完成了释放一次性元素的工作,即

using (StreamReader sr = StreamReader(filename)) 
{
    txt = sr.ReadToEnd();
}

但是,如果我在线使用它,会发生同样的情况吗?如您所见,我没有将其定义为变量:

 txt = (StreamReader(filename)).ReadToEnd(); 

3 个答案:

答案 0 :(得分:2)

定义或不定义变量不会影响是否需要处置对象。

如果创建了实现@Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; GroundOverlayOptions overlayZoo = new GroundOverlayOptions() .image(BitmapDescriptorFactory.fromResource(R.drawable.zoo)) .transparency(0.5f) .bearing(135) .position(new LatLng(24.995517, 121.584058), 1000f); mGoogleMap.addGroundOverlay(overlayZoo); mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(24.995517, 121.584058), 15.0f)); } 的类的实例,则应在完成后调用IDisposable

您可以使用Dispose或手动调用using来执行此操作 - Dispose语句通常更方便且更加万无一失。

答案 1 :(得分:1)

首先,dispose方法允许类的开发人员(在这种情况下为System.IO.StreamReader)释放他们可能持有的任何非托管资源(并且很多人使用它进行一般清理)

通常,如果一个类实现了IDisposable(因此包含一个Dispose方法),那么它绝对应该被调用。

您上面使用的using语句将编译为以下内容:

//Very roughly your code sample
using (var sr = new StreamReader())
{
    //Some code
}

//What gets spat out by the compiler
var sr = new StreamReader();
try
{
    //Some code
}
finally
{
    sr.Dispose();
}

如您所见,此模式意味着无论//Some code部分是否抛出异常,都将调用Dispose。

基本上,它是C#帮助器,因此您不必编写上面的安全代码,以确保处理一次性对象。

由于明显的好处,问题应该是"当不应该你使用"。

答案 2 :(得分:1)

在第二个示例中,会发生同样的事情,正如第一个示例中所发生的那样。在第二个示例中,StreamReader将在该行执行后立即变为符合条件进行垃圾回收,因为您不将其存储在变量中(因此它将超出范围)。这里的关键词是“符合条件的” - 无法保证何时实际清理对象。所以第二行代码将导致文件锁定被“保持”,直到垃圾收集器转向垃圾收集StreamReader。

另一方面,如果你在Dispose()上调用StreamReader,它会立即释放对文件的锁定,而不必等待垃圾收集器。