当前位置: 首页 > 编程语言 > C#

using关键字和IDisposable接口有什么关系?share

时间:2023-04-10 23:13:20 C#

usingkeyword和IDisposable接口有什么关系?如果我使用using关键字,我还需要实现IDisposable吗?如果使用using语句,则封闭类型必须已实现IDisposable,否则编译器将发出错误。因此,将IDisposable实现视为使用的先决条件。如果要在自定义类上使用using语句,则必须为其实现IDisposable。然而,这是一种落后的做法,因为这样做没有意义。仅当您有处理非托管资源之类的事情时才应实施它。//要在C#中实现它:classMyClass:IDisposable{//类中的其他成员publicvoidDispose(){//以最简单的形式,但请参阅上面链接的MSDN文档}}这使您能够:使用(MyClassmc=newMyClass()){//对实例做一些事情...mc.DoThis();//所有假方法调用,例如mc.DoThat();}//这里会自动调用.Dispose方法。其实和写法一样:MyClassmc=newMyClass();try{//用实例做一些事情...mc.DoThis();//所有假方法调用,例如mc.DoThat();}finally{//总是运行mc.Dispose();//手动调用。你离不开另一个。当你写:using(MyClassmyObj=newMyClass()){myObj.SomeMthod(...);编译器将生成如下内容:MyClassmyObj=null;尝试{myObj=newMyClass();myObj.SomeMthod(...);}finally{if(myObj!=null){((IDisposable)myObj).Dispose();因此,正如您在使用关键字时看到的那样,假设/需要实现IDisposable。你是个乱七八糟的东西。您只能在实现IDisposable的事物上使用“using”关键字。编辑:如果您使用using关键字,则不必显式调用Dispose,它将在using块的末尾自动调用。其他人发布了如何将using语句转换为try-finally语句,并在finally块中调用Dispose的示例。是的,using关键字是这种模式的语法糖...(来自msdn)Fontfont1=newFont("Arial",10.0f);尝试{字节字符集=font1.GdiCharSet;}finally{if(font1!=null)((IDisposable)font1).Dispose();编辑:一个有用的例子。当你发现你在上一节中做某事时,比如设置Cursor等待光标重置为默认值,这就是这种模式的候选者......publicclassBusy:IDisposable{privateCursor_oldCursor;privateBusy(){_oldCursor=Cursor.Current;}publicstaticBusyWaitCursor{get{Cursor.Current=Cursors.WaitCursor;返回新的忙碌();}}#regionIDisposableMemberspublicvoidDispose(){Cursor.Current=_oldCursor;}#endregion}被调用...using(Busy.WaitCursor){//一些需要等待游标的操作。}Use只会丢弃一次性项目。因此,在未实现IDisposable的对象周围包装一个using块实际上是无用的,实际上会导致编译器错误。http://msdn.microsoft.com/en-us/library/yh598w02.aspx通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。using语句以正确的方式调用对象的Dispose方法,一旦调用Dispose,也会导致对象本身超出范围。在using块中,对象是只读的,不能修改或重新分配。using语句确保即使在调用对象的方法时发生异常,也会调用Dispose。您可以通过将对象放在try块中然后在finally块中调用Dispose来获得相同的结果;事实上,这就是编译器翻译using语句的方式。您必须实施IDisposable才能使用它。如果您尝试在未实现IDisposable的类型上使用using(),您将收到以下编译时错误:errorCS1674:'SomeType':using语句中使用的类型必须可隐式转换为'System.IDisposable'using关键字已经实现了,所以如果你使用using关键字,你不必调用IDisposable。以上就是C#学习教程:using关键字和IDisposable接口有什么关系?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: