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
不会关闭你的
流。太好了!我不知道这个选择,谢谢。