如果您使用using
方法而不是让我们说FileStream.Close();
,那么该课程会正确处理吗?
private static string GetString()
{
using(FileStream fs = new FileStream("path", FileMode.Open))
using(StreamReader sr = new StreamReader(fs))
{
return sr.ReadToEnd();
}
}
相当于:
private static string GetString()
{
string toReturn = "";
FileStream fs = new FileStream("path", FileMode.Open)
StreamReader sr = new StreamReader(fs)
toReturn = sr.ReadToEnd();
sr.Close();
fs.Close();
return toReturn;
}
或者:
private static string GetString()
{
FileStream fs;
StreamReader sr;
try
{
string toReturn = "";
fs = new FileStream("path", FileMode.Open)
sr = new StreamReader(fs)
toReturn = sr.ReadToEnd();
sr.Close();
fs.Close();
return toReturn;
}
finally
{
if(sr != null)
sr.Close();
if(fs != null)
fs.Close();
}
}
答案 0 :(得分:2)
从using
语句生成的代码与您的第二个示例非常相似(最大的区别是它调用IDisposable.Dispose
而不是Close
)。它总是会正确处理对象,无论方法是通过return
还是抛出异常退出。
如果您感到好奇,这是没有using
的C#代码,它编译为与using
s的示例相同的IL:
private static string GetString()
{
FileStream fs = new FileStream("path", FileMode.Open);
try
{
StreamReader sr = new StreamReader(fs);
try
{
return sr.ReadToEnd();
}
finally
{
if (sr != null)
((IDisposable)sr).Dispose();
}
}
finally
{
if (fs != null)
((IDisposable)fs).Dispose();
}
}
答案 1 :(得分:1)
看一下using
声明:
http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.110).aspx
它应该相当于:
FileStream fs = null;
try
{
fs = new FileStream("path", FileMode.Open);
StreamReader sr = null;
try
{
sr = new StreamReader(fs);
toReturn = sr.ReadToEnd();
return toReturn;
}
finally
{
if(sr != null)
sr.Dispose();
}
}
finally
{
if(fs != null)
fs.Dispose();
}
在Dispose
方法内,它会调用Close
stream。
答案 2 :(得分:0)
如果它实现IDisposable
,则在退出使用块时将正确关闭它。