我知道在下面的案例中,using
完成了释放一次性元素的工作,即
using (StreamReader sr = StreamReader(filename))
{
txt = sr.ReadToEnd();
}
但是,如果我在线使用它,会发生同样的情况吗?如您所见,我没有将其定义为变量:
txt = (StreamReader(filename)).ReadToEnd();
答案 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
,它会立即释放对文件的锁定,而不必等待垃圾收集器。