Tag: idisposable

将IDisposable传递到父IDisposable时的结果是什么?

昨天,在我们的代码库上运行Visual Studio代码分析后,以下代码突出显示为一个问题: using (var stringReader = new StringReader(someString)) { using (var reader = XmlReader.Create(stringReader)) { // Code } } 返回的警告是 警告CA2202对象’stringReader’可以在方法’(方法名称)’中多次处理。 为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose。 在搜索堆栈溢出之后,我得出一般的理解,如果我要创建一个包含IDisposable成员的自定义类,它应该实现IDisposable本身,并调用该成员的dispose()方法。 我的两个问题是 在对象X在创建过程中引用IDisposable对象Y作为参数的所有情况下,假设对象X将获得Y的所有权并且从该点开始是正确的,调用X.dispose()将始终导致调用Y.dispose() 这是一段旧代码,并且从未报告过警告消息中描述的exception(据我所知)。 如果假设上述点,为什么double using block不会导致调用stringReader.dispose()两次因此抛出exception?

如何以及何时处置/垃圾收集单例实例

我正在使用从嵌套类创建的Singleton实例。 这个实例保存了一些静态集合,这些集合在处理Singleton时被清除,但问题是我得到了对非null处理的Singleton的引用,它没有正确地进行垃圾回收。 我想知道WHEN以及如何完全处理和垃圾收集我的Singleton实例,以便在dispose(并设置为null)后再次查询实例时,会创建一个新实例。 我对Singleton实例使用以下嵌套模式: public class SingletonClass : IDisposable { private List _collection; private SingletonClass() { } public static SingletonClass Instance { get { return Nested.Instance; //line 1 – this line returns the non-null instance after dispose and setting the Singleton instance to null which is causing problems } } private void Init() { _collection […]

通过构造函数链传递IDisposable对象

我有一个小的对象层次结构,通常是从Stream数据构造的,但是对于某些特定的子类,可以从更简单的参数列表中合成。 在从子类链接构造函数时,我遇到了一个问题,即确保处理基类构造函数所需的合成流。 它没有逃过我的说法,这种方式使用IDisposable对象可能只是脏池(plz建议?),原因我没有考虑过,但是,除了这个问题外,它似乎相当简单(并且封装良好)。 代码: abstract class Node { protected Node (Stream raw) { // calculate/generate some base class properties } } class FilesystemNode : Node { public FilesystemNode (FileStream fs) : base (fs) { // all good here; disposing of fs not our responsibility } } class CompositeNode : Node { public CompositeNode (IEnumerable some_stuff) […]

如果使用块返回,是否会丢弃IDisposable?

例如 using(var something = GetSomething()) { something.DoSomething(); if(something.IsX()) return true; } return false;

我该如何确保处理可能的一次性物品?

我正在开发一个.NET项目,它需要与一些用户定义的类进行交互 – 称为“作业”。 所有作业类必须按顺序实现特定的接口IJob ,以便库使用它们。 有时,作业类可能包含非托管资源,需要明确处理。 如果我事先不知道工作是否需要明确处理,我应该如何确保所有工作在使用后妥善处理? 我自己有一些想法,但是想听听你的意见/建议: 使IJob : IDisposable ,强制所有作业实现Dispose()方法。 这将允许我using块中的作业,但由于大多数作业不需要明确处理,这可能会给客户端开发人员带来不必要的混淆。 完成涉及try-finally块中的作业的所有工作,并finally使用以确保在作业实现IDisposable调用Dispose() 。 这使得客户端更容易实现新的作业类 – 不必实现空的Dispose()方法 – 但它也隐藏了库知道并关心可支配作业的事实。 写完这篇文章之后,我倾向于倾向于解决方案#1,但我仍然认为看到替代解决方案会更好,并且我已经考虑过两者的其他优缺点。

事务范围类似的function

我希望设置一些非常类似于事务范围的东西,它在服务上创建一个版本,并在范围的末尾删除/提交。 在事务范围内运行的每个SQL语句在内部查看某个连接池/事务存储,以确定它是否在范围内并做出适当的反应。 呼叫者不需要将事务传递给每个呼叫。 我正在寻找这个function。 这里有一点关于它: https : //blogs.msdn.microsoft.com/florinlazar/2005/04/19/transaction-current-and-ambient-transactions/ 这是基本的一次性课程: public sealed class VersionScope : IDisposable { private readonly GeodatabaseVersion _version; private readonly VersionManager _versionManager; public VersionScope(Configuration config) { _versionManager = new VersionManager(config); _version = _versionManager.GenerateTempVersion(); _versionManager.Create(_version); _versionManager.VerifyValidVersion(_version); _versionManager.ServiceReconcilePull(); _versionManager.ReconcilePull(_version); } public void Dispose() { _versionManager.Delete(_version); } public void Complete() { _versionManager.ReconcilePush(_version); } } 我希望到目前为止我编写的所有代码的能力都没有任何版本的概念。 我只想包括一个简单的 […]

重用SqlConnection的最佳实践

我来自Java经验,我试图从C#开始。 我已经阅读了SqlConnection SqlCommand SqlDataReader IDisposable ,我可以理解连接到数据库的最佳做法是在自己的using块中包装SqlConnection , SqlCommand和SqlDataReader 。 但在Java中,我们使用将连接封装到工厂方法中,仅创建一次,并将其重用于所有查询,甚至是multithreading查询。 仅为每个查询创建语句和结果集,并尽快关闭。 是不是为每个查询创建一个新的SqlConnection有点矫枉过正? 不能重复使用吗?

什么时候处理?

我对所有关于IDispose和“使用”语句的讨论感到困惑。 我想知道是否有人可以告诉我是否需要在以下测试示例中使用“using”语句或某种IDispose实现… public class Main() { MyFile myFile = new MyFile(“c:\subdir\subdir2\testFile.txt”); Console.Writeline(“File Name: ” + myFile.FileName() + “File Size: ” + myFile.FileSize()); } public class MyFile { private FileInfo _fInfo; public MyFile(string fullFilePath) { _fInfo = new FileInfo(fullFilePath); } public string FileName() { return _fInfo.Name; } public long FileSize() { return _fInfo.Length; } }

将使用null工作吗?

如果资源没有实现IDisposable,以下代码是否可行? T resource = new T(); using (resource as IDisposable) { … }

实现IDisposable(一次性模式)作为服务(类成员)

Disposable模式是基于每个类重新实现的模式。 所以,我一直在寻找一种概括它的方法。 几年前我遇到的问题是,即使你把它作为类本身实现,你也不能从一个Disposable实现和另一个类派生一个对象(C#不支持多inheritance)。 问题是, 如何实现一般方法来实现Disposable模式,这样您就不需要为实现IDisposable的类显式编写它? 以下是Visual Studio(VS 2015)为您生成的标准Disposable模式。 public class TestClass : IDisposable { #region IDisposable Support private bool disposedValue = false; // To detect redundant calls protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // TODO: dispose managed state (managed objects). } // TODO: free unmanaged resources (unmanaged objects) and […]