标签: idisposable

在c#中嵌套"using"语句的任何问题?

我最近下载了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)

我理解分析警告试图告诉我以这种方式处理多个对象可能会导致对象处置问题.

我确信在上面的例子中处理一个对象不会抛出异常.那么我应该修改我的代码还是保持原样?

c# idisposable using

25
推荐指数
5
解决办法
3800
查看次数

如何用指令写几个?

可能重复:
使用包含多个变量的语句

我有几个一次性物品要管理.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)

.net c# idisposable using

23
推荐指数
4
解决办法
489
查看次数

应该使用Closeable作为.NET的IDisposable的Java等价物吗?

更新:正如@PaulGroke在下面指出的那样,Java 7已经发生了变化:现在有了AutoCloseable.这与新的try-with-resources构造没有关联并且受流支持.

AutoCloseable是.NET IDisposable接口的直接Java等价物.


CloseableJava 1.5中引入的接口与流紧密相关,甚至还有一个异常说明符IOException.这表明它应该仅用于流或其他IO相关活动,而不是通用清理逻辑.

当然,该close()方法的描述在流/ IO上下文之外完全没有意义:

void close() throws IOException

关闭此流并释放与其关联的所有系统资源.

因此,我应该使用它上面DisposableDispose()方法声明我自己的接口,并将其用作.NET IDisposable接口的模拟吗?或者我应该重复使用,Closeable即使它可能不是一个完美的合适?

java idisposable

22
推荐指数
2
解决办法
1万
查看次数

我该如何继承IDisposable?

班级名称已被更改以保护无辜者.

如果我有一个名为ISomeInterface的接口.我还有继承接口的类,FirstClass和SecondClass.FirstClass使用必须处理的资源.SecondClass没有.

所以问题是,我应该从IDisposable继承哪里?以下两个选项似乎都不太理想:

1)使FirstClass继承IDisposable.然后,任何处理ISomeInterfaces的代码都必须知道是否要处理它们.这闻起来像是与我紧密耦合.

2)使ISomeInterface继承IDisposable.然后,任何从它继承的类都必须实现IDisposable,即使没有任何东西可以处理.除了注释之外,Dispose方法基本上是空白的.

#2对我来说似乎是正确的选择,但我想知道是否有其他选择.

c# inheritance coupling idisposable interface

22
推荐指数
1
解决办法
6381
查看次数

关于实体框架上下文生命周期的问题

我对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)

上面的代码将不起作用,因为在视图呈现页面时,实体框架上下文已超出范围.其他人如何构建上面的代码?

c# asp.net-mvc entity-framework idisposable using

22
推荐指数
2
解决办法
2万
查看次数

如何从方法中返回Stream,知道它应该被处理?

我有一个方法,将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.

如何有效地返回文件流并关闭它?

c# idisposable using stream

22
推荐指数
3
解决办法
1万
查看次数

识别Visual Studio中的一次性对象?

建议IDisposable对象应该在using声明中或通过调用Dispose()方法处理.我发现在Visual Studio中查找对象是否是一次性的并不直观.

我的问题是:有没有办法识别IDisposableVS中的对象?

.net c# intellisense idisposable visual-studio

22
推荐指数
6
解决办法
4219
查看次数

如何正确处理WebResponse实例?

通常,使用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文档中给出的示例完全不合适.

.net c# idisposable webresponse

21
推荐指数
2
解决办法
9586
查看次数

在ASP.NET中实现文件下载时如何处理文件流?

我有一个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)

c# asp.net asp.net-mvc streaming idisposable

21
推荐指数
1
解决办法
9845
查看次数

我是否需要处理SemaphoreSlim

根据文件:

"a SemaphoreSlim不使用Windows内核信号量".

是否有任何特殊资源SemaphoreSlim使得DisposeSemaphoreSlim不再使用遗嘱时呼叫很重要?

.net c# dispose semaphore idisposable

20
推荐指数
4
解决办法
3812
查看次数