读完线程后SqlCommand.Dispose足够吗?和关闭和处置WCF服务,我琢磨类,如SqlConnection的或几类从Stream类继承它的问题,如果我收处置,而不是关闭的一个?
类如Stream,StreamReader,StreamWriter等工具IDisposable界面.这意味着,我们可以Dispose()在这些类的对象上调用方法.他们还定义了一个public名为的方法Close().现在让我感到困惑的是,一旦我完成了对象,我该怎么称呼?如果我同时打电话怎么办?
我目前的代码是这样的:
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responseStream))
{
using (StreamWriter writer = new StreamWriter(filename))
{
int chunkSize = 1024;
while (!reader.EndOfStream)
{
char[] buffer = new char[chunkSize];
int count = reader.Read(buffer, 0, chunkSize);
if (count != 0)
{
writer.Write(buffer, 0, count);
}
}
writer.Close();
}
reader.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我编写了using()构造,自动调用Dispose()每个对象的方法.但我也称之为Close()方法.这样对吗?
请告诉我使用流对象时的最佳做法.:-)
MSDN示例不使用using()构造,并且调用 …
Flush()如果我写这样的东西,我不确定是否需要调用使用过的对象:
using (FileStream...)
using (CryptoStream...)
using (BinaryWriter...)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
它们总是自动刷新吗?什么时候该using声明冲洗它们,当它不(如果可能发生)?
在using语句中使用内存流时,是否需要调用close?例如这里需要ms.Close()吗?
using (MemoryStream ms = new MemoryStream(byteArray))
{
// stuff
ms.Close();
}
Run Code Online (Sandbox Code Playgroud) using ( var sw = new StreamWriter ( file ) )
{
XmlSerializer xs = new XmlSerializer ( typeof ( T ) );
xs.Serialize ( sw, data );
sw.Close()
}
Run Code Online (Sandbox Code Playgroud)
我知道你不必打电话Dispose但是你必须打电话给这个Close方法sw吗?
FileStream f=new FileStream("c:\\file.xml",FileMode.Create);
StreamWriter sf=new StreamWriter(f);
sf.WriteLine(stroka);
sf.Close();
sf.Dispose();
f.Close();
f.Dispose();
FileStream f1=new FileStream("c:\\file.xml",FileMode.Open);
StreamReader sr=new StreamReader("c:\\file.xml");
xmlreader=new XmlTextReader(sr);
sr.Close();
sr.Dispose();
f1.Close();
f1.Dispose();
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
该进程无法访问文件'c:\ file.xml',因为它正由另一个进程使用
我已经全部关闭并且全部处理掉了.有什么问题?
c# ×5
.net ×3
stream ×3
using ×2
dispose ×1
file ×1
flush ×1
idisposable ×1
memorystream ×1
streamreader ×1
streamwriter ×1
writer ×1