写自己的Dispose方法而不是使用Idisposable在看了很多关于Idisposable的文章后,我对它的用法感到困惑。所有文章都解释了它是什么以及如何实现它。如果我们不这样做,我想了解我们会错过什么。它是一个包含方法Dispose()的接口。让我们举一个通常使用dispose来处理数据库连接的例子。代码就像PublicclassTest:Idisposable{publicTest(){DatabaseConnectiondatabaseConnection=newDatabaseConnection();}publicvoidDispose(){if(this.databaseConnection!=null){this.databaseConnection.Dispose();this.databaseConnection=null;}}}虽然实现了dispose,但是在dispose方法中,使用了databaseconnection的dispose属性来释放连接(this.databaseConnection.Dispose();)我的问题是为什么这种情况下需要实现IDisposable?我们可以直接调用this.databaseConnection.Dispose()并释放连接。为什么在内部实现dispose也是调用对象的dispose属性。作为Idisposable方法的替代方法,我们可以实现release方法来释放内存。公共类测试{publicTest(){DatabaseConnectiondatabaseConnection=newDatabaseConnection();}publicvoidRelease(){if(this.databaseConnection!=null){this.databaseConnection.Dispose();this.databaseConnection=null;这两种方法有什么区别?我们真的需要Idisposable吗?我期待着具体的解释。你是对的,使用你的发布方法你会得到完全相同的效果,只要你总是记得调用它。您应该为此类操作使用Dispose/IDisposable的原因是一致性。所有.NET开发人员都知道IDisposable模式,IDisposable类表示您应该处理它,并使用Dispose方法来执行它。换句话说,使用IDisposable模式会立即告诉另一个开发人员他应该释放该类占用的资源,并且他应该通过调用Dispose方法来执行此操作。实现IDisposable的另一个好处是使用块,它适用于任何IDisposable类:using(vart=newTest()){//uset}使用上面的代码将导致在using结束时使用Dispose()堵塞。它是一个try...finally块的语法糖,但它往往使这种代码更清晰,更易于阅读和编写。如果您的Release()工作正常(它没有,但那是另一回事),那么人们将不得不了解它,并通过另一个班级学习其他东西,等等。您的Release()将永远不会以编程方式找到。在适用的情况下,可以通过编程方式调用Dispose():if(objisIDisposable)((IDisposable)obj)。处置();虽然不常做,但一旦做了,就很关键。有时,如果有人可能想在对象使用期间调用Release()之类的方法,则该方法很有用。Stream上的Close()就是一个例子。请注意,尽管Stream.Dispose()仍然存在并调用Close()。IDisposable之所以值得实现,主要是因为它在C#中是一个个体。每个人都知道IDisposable的作用,以及如何处理实现IDisposable的对象。当您使用IDisposable.Dispose()以外的其他方式释放资源时,您偏离了通常理解的习语。这意味着维护者不必了解您的特定类的来龙去脉,从而防止资源泄漏。6个月后,当您忘记大部分代码时,甚至可能是您自己!您只需要知道它实现了IDisposable,它具有普遍理解的含义。请记住,IDisposable主要是给开发人员的一个信号,“嘿,我是一个包含对非托管资源的引用的类。你可能不应该等待垃圾收集器来清理我。”请注意,这可能是间接的By组合(实现IDisposable的类,因为它有一个实现IDisposable的私有成员)。当一个体面的C#开发人员看到一个实现了IDisposable的类时,他们应该立即想到“这个对象很特殊,当我用完它时需要清理它”。没有什么能阻止您编写Release()方法;这只是意味着您更有可能意外泄漏资源,因为您没有使用惯用模式。publicclassDotNetTips{privatevoidDoSomeOperation(){using(SqlConnectioncon1=newSqlConnection("FirstConnectionString"),con2=newSqlConnection(("SecondConnectionString")){//其余代码放在这里}}privatevoidDoSomeOtherOperation(){using(SqlConnectioncon=newSqlConnection("ConnectionString"))using(SqlCommandcmd=newSqlCommand()){//其余代码放在这里}}}当我们必须调用时,using语句很有用在不同的对象上多次使用Dispose方法。否则,我们将不得不在每个对象上调用Dispose方法,如下所示:if(con!=null)con.Dispose();if(cmd!=null)cmd.Dispose();将在未来的某个不确定点由垃圾收集自动处理。但是,当处理可能包含非托管资源(不受CLR/垃圾收集控制)的对象时,应实现IDisposable以提供将这些资源返回给操作系统一致且确定性的方法。只有在using(){...}块的上下文中使用该对象时,该接口才提供真正的好处。这样的块告诉CLR在到达块的右大括号时调用Dispose方法。因此,无论在此块中发生什么(没有一些灾难性的系统故障),您都可以保证调用Dispose方法并释放您的非托管资源。例如,在您提供的代码中,如果抛出异常,它可能永远不会调用您的Release()方法,可能会使连接保持打开状态。但是,当使用带有using块的一次性对象时,当抛出异常时,CLR会在抛出异常之前跳入并调用Dispose方法。以上就是C#学习教程:自己写Dispose方法代替使用Idisposable,分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
