C# BinaryReader在函数作用域后处理
只是想验证一下我不会有任何把手泄漏之类的。。 我有以下方法C# BinaryReader在函数作用域后处理,c#,.net-4.0,garbage-collection,C#,.net 4.0,Garbage Collection,只是想验证一下我不会有任何把手泄漏之类的。。 我有以下方法 public static MyObject DoSomething(Stream MyStream) { var br = new BinaryReader(MyStream); return DoMoreThings(br); } 我在外部创建了MyStream。可以安全地说,在这个函数之后,br将被GC安全地收集吗?我没有明确地处理它。它最终会处理好的,但是您应该像这样
public static MyObject DoSomething(Stream MyStream)
{
var br = new BinaryReader(MyStream);
return DoMoreThings(br);
}
我在外部创建了
MyStream
。可以安全地说,在这个函数之后,br
将被GC安全地收集吗?我没有明确地处理它。它最终会处理好的,但是您应该像这样键入它
using(var br = new BinaryReader(MyStream))
{
return DoMoreThings(br);
}
使用
语句是try.finally block上的一种语法糖分,激发Dispose
方法。所有实现IDisposable接口的对象都应该手动处理。尽管垃圾收集器最终会收集到这些对象,但不将其收集起来是一种相当糟糕的做法
您可以使用将其包装在中,以确保其已清理干净:
using (var br = new BinaryReader(MyStream))
{
return DoMoreThings(br);
}
这里唯一的缺点是使用
意味着它将调用br.Dispose
,这将关闭底层流:MyStream
。您可以通过调用,告诉它让流保持打开状态来防止这种情况:
using (var br = new BinaryReader(MyStream, Encoding.UTF8, true))
用与文件中字符串匹配的任何编码替换编码.UTF8
Encoding.UTF8
是构造函数使用的默认值,它不接受编码参数。这取决于domoreights(br)
对读卡器所做的操作,如果它返回的内容仍然需要访问读卡器,则不应丢弃它,相反,返回的对象应该是IDisposable
,处理返回的对象应该处理内部读取器。我做到了!但是它关闭了MyStream,我在这个函数之后需要它…这就是为什么我不能在这里使用它…你说呢?@user1025852使用使用(var br=new BinaryReader(MyStream,new UTF8Encoding(),true))
并且BinaryReader
不会关闭你的流。太好了!我不知道这个选择,谢谢。