我知道这里有很多关于如何使用using语句和调用Dispose()方法的线程.我已经阅读了大部分这些主题.
如果我调用Dispose(),它会调用Close()吗?
如果我想使用一个对象(比如SqlDataReader),然后在另一个代码块中再次使用它,我应该不调用Dispose()吗?这也意味着省略using语句.
另外,为了澄清一下,如果FileStream正在包装StreamWriter并且我在FileStream上调用dispose,这将调用Flush(),Close()和Dispose()(取决于Dispose()是否在StreamWriter上调用Close()),对?同样,如果我在FileStream上调用Close,这将只调用FileStream上的Flush()和Close().
检查IL是一个很好的方式来回答这些关于幕后发生的事情的问题吗?
"如果我调用Dispose(),它会调用Close()吗?"
从理论上讲,它应该.BCL类都是这样做的,但由图书馆作者来正确处理这个问题.如果正在使用的库已正确完成,Dispose()也应该是Close()[和Close()将Dispose() - 调用应该是可互换的].
"如果我想使用一个对象(比如SqlDataReader),但是在另一个代码块中再次使用它,我应该不调用Dispose()吗?这也意味着省略using语句."
正确.如果使用using语句,它将始终调用Dispose().这将关闭数据阅读器,然后其他块可以使用它.
"另外,为了澄清,如果FileStream正在包装StreamWriter并且我在FileStream上调用dispose,这将调用Flush(),Close()和Dispose()(取决于Dispose()是否在StreamWriter上调用Close()) ,对吧?同样,如果我在FileStream上调用Close,这只会调用FileStream上的Flush()和Close()."
如果你围绕StreamWriter包装FileStream,我强烈建议一致地处理它们.对两个成员使用单个using语句,因此它们都在块的末尾处理掉.这是最安全,最干净的方法.
"检查IL是一个很好的方式来回答这些关于引擎盖下发生的事情的问题吗?"
这是一种方式 - 虽然是一种更困难的方式.在MSDN上阅读有关使用和流的内容,文档将以简单的术语解释它,而不是试图解析IL.如果你好奇,IL会告诉你究竟发生了什么.