我最近下载了Visual Studio 2013,并在我正在处理的项目上运行了代码分析.它引发了一些我正在解决的问题,但其中一个特别是关于我如何使用"使用"IDisposable语句.
这是我的代码示例:
using (MemoryStream msDecrypt = new MemoryStream(encryptedText.ToBase64Byte()))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我理解分析警告试图告诉我以这种方式处理多个对象可能会导致对象处置问题.
我确信在上面的例子中处理一个对象不会抛出异常.那么我应该修改我的代码还是保持原样?
可能重复:
使用包含多个变量的语句
我有几个一次性物品要管理.CA2000规则要求我在退出范围之前处置所有对象..Dispose()如果我可以使用using子句,我不喜欢使用该方法.在我的具体方法中,我应该在使用中写许多:
using (Person person = new Person()) {
using (Adress address = new Address()) {
// my code
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以另一种方式写这个:
using (Person person = new Person(); Adress address = new Address())
Run Code Online (Sandbox Code Playgroud) 更新:正如@PaulGroke在下面指出的那样,Java 7已经发生了变化:现在有了AutoCloseable.这与新的try-with-resources构造没有关联并且受流支持.
AutoCloseable是.NET IDisposable接口的直接Java等价物.
CloseableJava 1.5中引入的接口与流紧密相关,甚至还有一个异常说明符IOException.这表明它应该仅用于流或其他IO相关活动,而不是通用清理逻辑.
当然,该close()方法的描述在流/ IO上下文之外完全没有意义:
void close() throws IOException关闭此流并释放与其关联的所有系统资源.
因此,我应该使用它上面Disposable的Dispose()方法声明我自己的接口,并将其用作.NET IDisposable接口的模拟吗?或者我应该重复使用,Closeable即使它可能不是一个完美的合适?
班级名称已被更改以保护无辜者.
如果我有一个名为ISomeInterface的接口.我还有继承接口的类,FirstClass和SecondClass.FirstClass使用必须处理的资源.SecondClass没有.
所以问题是,我应该从IDisposable继承哪里?以下两个选项似乎都不太理想:
1)使FirstClass继承IDisposable.然后,任何处理ISomeInterfaces的代码都必须知道是否要处理它们.这闻起来像是与我紧密耦合.
2)使ISomeInterface继承IDisposable.然后,任何从它继承的类都必须实现IDisposable,即使没有任何东西可以处理.除了注释之外,Dispose方法基本上是空白的.
#2对我来说似乎是正确的选择,但我想知道是否有其他选择.
我对ASP.NET MVC应用程序中实体框架上下文的期望生命周期有一些疑问.是不是最好尽可能在最短的时间内保持上下文?
请考虑以下控制器操作:
public ActionResult Index()
{
IEnumerable<MyTable> model;
using (var context = new MyEntities())
{
model = context.MyTable;
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将不起作用,因为在视图呈现页面时,实体框架上下文已超出范围.其他人如何构建上面的代码?
我有一个方法,将FileStream作为输入.此方法在for循环内运行.
private void UploadFile(FileStream fileStream)
{
var stream = GetFileStream();
// do things with stream
}
Run Code Online (Sandbox Code Playgroud)
我有另一种方法,它创建并返回FileStream:
private FileStream GetFileStream()
{
using(FileStream fileStream = File.Open(myFile, FileMode.Open))
{
//Do something
return fileStream;
}
}
Run Code Online (Sandbox Code Playgroud)
现在第一个方法抛出一个ObjectDisposedException当我尝试访问返回的FileStream时,可能是因为它已经关闭,因为我正在使用" using"来正确处理流.
如果我不使用"using"而是按如下方式使用它,那么FileStream将保持打开状态,循环的下一次迭代(在同一文件上运行)会抛出异常,告知文件已在使用中:
private FileStream GetFileStream()
{
FileStream fileStream = File.Open(myFile, FileMode.Open);
//Do something
return fileStream;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用try-finally块,我在那里关闭流,finally那么它也会抛出ObjectDisposedException.
如何有效地返回文件流并关闭它?
建议IDisposable对象应该在using声明中或通过调用Dispose()方法处理.我发现在Visual Studio中查找对象是否是一次性的并不直观.
我的问题是:有没有办法识别IDisposableVS中的对象?
通常,使用WebRequest编写类似这样的代码来下载一些数据.
using(WebResponse resp = request.GetResponse()) // WebRequest request...
using(Stream str = resp.GetResponseStream())
; // do something with the stream str
Run Code Online (Sandbox Code Playgroud)
现在,如果抛出WebException,WebException会引用WebResponse对象,该对象可能会或可能不会调用Dispose(取决于发生异常的位置,或者响应类的实现方式) - 我不知道.
我的问题是如何处理这个问题.是否应该编写一个非常防御性的编码,并在WebException对象中处理响应(这有点奇怪,因为WebException不是IDisposable).或者是否应该忽略这一点,可能访问已处置的对象或从不处置IDisposable对象?WebException.Response的MSDN文档中给出的示例完全不合适.
我有一个DocumentGenerator包装的课程MemoryStream.所以我已经IDisposable在课堂上实施了.
我看不出如何/在哪里可以处理它.
这是我当前的代码,它在MVC中执行文件下载:
using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))
{
/* some document manipulation with the
DocumentGenerator goes here ...*/
return File(dg.GetDocumentStream(), "text/plain", filename);
}
Run Code Online (Sandbox Code Playgroud)
在控制器完成之前关闭/处理流时出现此错误.在这种情况下,如何确保我的资源得到妥善处理?
编辑:我现在的执行IDisposable只是处置MemoryStream.我知道这不是一个正确的实现,我只是用它作为测试.有什么不同我可以在这里做它的工作吗?
public void Dispose()
{
_ms.Dispose();
_ms = null;
}
Run Code Online (Sandbox Code Playgroud) 根据文件:
"a
SemaphoreSlim不使用Windows内核信号量".
是否有任何特殊资源SemaphoreSlim使得Dispose在SemaphoreSlim不再使用遗嘱时呼叫很重要?
idisposable ×10
c# ×9
.net ×4
using ×4
asp.net-mvc ×2
asp.net ×1
coupling ×1
dispose ×1
inheritance ×1
intellisense ×1
interface ×1
java ×1
semaphore ×1
stream ×1
streaming ×1
webresponse ×1