Tag: idisposable

方法返回一个IDisposable – 我应该处理结果,即使它没有分配给任何东西?

这似乎是一个相当简单的问题,但在搜索之后我找不到这个特殊的用例。 假设我有一个简单的方法,比如确定某个进程是否打开了一个文件。 我可以这样做(不是100%正确,但相当不错): public bool IsOpen(string fileName) { try { File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None); } catch { // if an exception is thrown, the file must be opened by some other process return true; } } (显然这不是确定这一点的最佳甚至是正确的方法 – File.Open会抛出许多不同的exception,所有exception都具有不同的含义,但它适用于此示例) 现在File.Open调用返回FileStream , FileStream实现IDisposable。 通常我们想要在使用块中包装任何FileStream实例的用法,以确保它们被正确处理掉。 但是在我们实际上没有将返回值分配给任何东西的情况下会发生什么? 是否仍然需要处理FileStream ,如下所示: try { using (File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)); { /* […]

using语句是否只处理它创建的第一个变量?

假设我有一个一次性对象MyDisposable , MyDisposable另一个一次性对象作为构造函数参数。 using(MyDisposable myDisposable= new MyDisposable(new AnotherDisposable())) { //whatever } 假设myDisposable不会将AnotherDisposable置于其dispose方法中。 这只能正确处理myDisposable吗? 或者它也处理AnotherDisposable ?

.NET – 使用单个using语句替换嵌套的using语句

如果您使用嵌套的using语句/资源遇到了一些这样的C#代码: using (var response = (HttpWebResponse)request.GetResponse()) { using (var responseStream = response.GetResponseStream()) { using (var reader = new BinaryReader(responseStream)) { // do something with reader } } } 用这样的东西替换它是否安全? using (var reader = new BinaryReader(((HttpWebResponse)request.GetResponse()).GetResponseStream())) { // do something with reader } 上面的例子只是嵌套的一次性资源的一个例子,所以请原谅我,如果它不是完全正确的用法。 我很好奇当你处理最外层的资源(在这种情况下是BinaryReader),它是否会为你递归地处理它的子节点,或者你是否需要用单独的using语句显式地处理每个“层”? 例如,如果你处理BinaryReader,它是否应该处理响应流,而响应流又处理响应? 考虑到最后一句话让我觉得你确实需要单独的using语句,因为没有办法保证包装器对象会处理内部对象。 是对的吗?

在Using Block中调用Environment.Exit()

如果我有一个控制台应用程序,其代码如下: using (DisposableObject object = new DisposableObject()) { if (a condition) Environment.Exit(0); // Do Stuff } 我的物体会被妥善处理吗? 或者在清理对象之前线程是否死亡?

这个IDisposable实现是否正确?

我永远不会记住实现IDisposable接口的所有规则,因此我尝试提出一个基类来处理所有这些并使IDisposable易于实现。 我只是想听听你的意见,如果这个实现是好的,或者你是否看到我可以改进的东西。 该基类的用户应该从它派生,然后实现两个抽象方法ReleaseManagedResources()和ReleaseUnmanagedResources() 。 所以这是代码: public abstract class Disposable : IDisposable { private bool _isDisposed; private readonly object _disposeLock = new object(); /// /// called by users of this class to free managed and unmanaged resources /// public void Dispose() { DisposeManagedAndUnmanagedResources(); } /// /// finalizer is called by garbage collector to free unmanaged resources […]

当一个struct是一个struct时,using语句是什么时候用它的参数?

我对以下代码有一些疑问: using System; namespace ConsoleApplication2 { public struct Disposable : IDisposable { public void Dispose() { } } class Program { static void Main(string[] args) { using (Test()) { } } static Disposable Test() { return new Disposable(); } } } 我的问题是: 在Disposable结构上运行的using语句是否会从Test()框返回结构? 我怎样才能找到自己的答案? 为了试图找出自己,我检查了上面代码生成的IL,这里是Main(…)方法的IL: .method private hidebysig static void Main(string[] args) cil managed { […]

从try / catch块返回的产量

正如Eric Lippert在本文中所描述的那样, try/catch子句中不允许yield return 。 有没有一种很好的方法可以得到这样的东西,而不必亲自编写我自己的IEnumerator : public IEnumerable GetData() { var transaction = Session.BeginTransaction()); try { IQuery q = CreateQuery(session); foreach (var result in q.Enumerable()) yield return ProjectResult(result); // <– doesn't work session.Commit(); } catch (Exception ex) { transaction.Rollback(); throw; } finally { transaction.Dispose(); } }

在C#中使用正确的IntPtr

我想我理解IntPtr的使用,虽然我真的不确定。 我从MSDN复制IDisposable模式只是为了看看我能从中得到什么,虽然我大部分时间都理解它,但我不知道如何正确实现IntPtr,或者甚至不知道它应该“指向什么” “参考或参考。 最重要的是,我不知道如何为IntPtr分配或转换整数,字符串,字符,双精度等来创建指针。 此外,IntPtr是否需要使用不安全的代码? 无论如何,这里有一些代码只是为了描绘我正在谈论的内容: namespace Utilities { class Disposer : IDisposable { private IntPtr handle; private Component component = new Component(); private bool disposed = false; public Disposer(IntPtr handle) { this.handle = handle; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if(!this.disposed) { if (disposing) { component.Dispose(); […]

在IDisposable类层次结构中正确处理ObjectDisposedException

正确实现IDisposable时,大多数实现(包括框架指南)都建议包含一个private bool disposed; 成员为了安全地允许多次调用Dispose() , Dispose(bool)以及在适当时抛出ObjectDisposedException 。 这适用于单个类。 但是,当您从可支配资源中inheritance子类,并且子类包含其自己的本机资源和独特方法时,事情会变得有点棘手。 大多数示例都展示了如何正确地重写Dipose(bool disposing) ,但不要超越它来处理ObjectDisposedException 。 在这种情况下,我有两个问题。 第一: 子类和基类都需要能够跟踪处置状态。 我知道有几个主要选项 – 1)声明私人布尔处置; 在这两个class级。 每个类跟踪它自己的this.disposed,并根据需要抛出。 2)使用protected bool Disposed {get; 私人集; 而不是一个字段。 这会让子类检查处理状态。 3)提供一些受保护的辅助方法来检查处理状态,如果对象被处理则通过reflection拉动当前类型名称来抛出。 我看到每个选项的优点是: 1)这“气味”给我,因为它包含重复的布尔值,但似乎工作正常。 我经常在子类化其他代码时使用它。 2)这取出了重复的布尔值,但不是设计指南书的编写方式等。这是我通常使用的,因为它使状态保持单点。 3)这对我来说似乎是最干净的选择,但没有出现在标准指南中。 对于一种方法而言,它可能比该类用户的其他方式要少一些。 在某些方面,我尝试过使用这三种方法。 我想知道这三种方法的优点和缺点,以及任何其他想法,以更清洁,更好的方式来处理这个问题。 你在处理这个问题时会做出什么选择?为什么? 第二: 抛出ObjectDisposedException ,您对name参数使用了什么? 我知道“典型”的方法调用是: throw new ObjectDisposedException(GetType().FullName); Microsoft员工在此页面上发表评论,建议实施具体类的全名是适当的用法。 在上面的第三个选项中,这将是唯一有意义的选择。 但是,如果类实现了throw本身,则可能会返回定义所调用方法的类的名称。 (即:基类可以返回基类的名称,而不是具体的子类) 我认为这不是一个好主意 – 但我在其他人编写的代码上遇到了这个问题。 使用实现方法的类的名称返回是有优点还是缺点?

在部署时将类保存到磁盘:我的代码是否有错误?

我正在尝试创建一个简单的类,当它不再使用时将其自身序列化为磁盘。 我现在的代码(见下文)。 我现在的代码似乎工作,但我对我的知识并不完全自信,所以我想知道是否有其他人看到这个代码有任何重大问题。 void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~MyClass() { Dispose(false); } protected virtual void Dispose(bool disposing) { if (!this.disposed) { MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, this); byte[] output = Dostuff(ms); File.WriteAllBytes(DBPATH, output); } this.disposed = true; }