当前位置:编程学习 > C#/ASP.NET >>

C#中如何判断一个对象Dispose了?

C#中如何判断一个对象Dispose了? --------------------编程问答-------------------- obj.IsDisposed ? --------------------编程问答-------------------- if this.IsDisposed --------------------编程问答--------------------
引用 1 楼 guwei4037 的回复:
obj.IsDisposed ?
没有这个IsDisposed哦??? --------------------编程问答--------------------
引用 2 楼 bdmh 的回复:
if this.IsDisposed
没有这个IsDisposed哦 --------------------编程问答-------------------- if(objectName is null)
XXX --------------------编程问答--------------------
引用 5 楼 guduheshao168 的回复:
if(objectName is null)
XXX
对象在dispose后不一定就是null啊 --------------------编程问答-------------------- 楼上的IsDisposed可以的啊,你准备判断什么对象 --------------------编程问答--------------------
引用 7 楼 guduheshao168 的回复:
楼上的IsDisposed可以的啊,你准备判断什么对象
你是怎么用的?比如数据的连接对象OracleConnection 调用Dispose后怎么判断其已经Dispose了?
Oracle.ManagedDataAccess.Client --------------------编程问答-------------------- 我没用过OracleConnection,我用的sql
不过原理都差不多
SqlConnection中有个State的属性,我会判断它是关闭,打开,或则是损坏等状态,根据这个状态修正SqlConnection到自己需要的状态 --------------------编程问答--------------------
引用 9 楼 guduheshao168 的回复:
我没用过OracleConnection,我用的sql
不过原理都差不多
SqlConnection中有个State的属性,我会判断它是关闭,打开,或则是损坏等状态,根据这个状态修正SqlConnection到自己需要的状态
SqlConnection也一样;State对应的是Open()/Close();SqlConnection对象dispose后也是没办法判断? --------------------编程问答-------------------- 貌似C#的对象Dispose释放后,没有办法判断已经Dispose了?只是就仅仅释放不可用,没法判断? --------------------编程问答-------------------- 楼主判断 Dispose了 ,有何用?    这个 Dispose方法是可以重复调用的。 --------------------编程问答-------------------- 注册Disposed事件吧 --------------------编程问答--------------------
引用 12 楼 claymore1114 的回复:
楼主判断 Dispose了 ,有何用?    这个 Dispose方法是可以重复调用的。

就是啊 你在需要的地方释放就行了啊 --------------------编程问答-------------------- connection.State==ConnectionState.Closed  ?? --------------------编程问答--------------------
引用 12 楼 claymore1114 的回复:
楼主判断 Dispose了 ,有何用?    这个 Dispose方法是可以重复调用的。
Dispose被调用后,所占用的资源将释放;比如Connection对象Close后还可以再Open,而Dispose后再Open将出错,意思就是如果某个Connection对象被Dispose后可以判断处理不想让其出错,或者再实例化一个。 --------------------编程问答--------------------
引用 14 楼 lxh13133718300 的回复:
Quote: 引用 12 楼 claymore1114 的回复:

楼主判断 Dispose了 ,有何用?    这个 Dispose方法是可以重复调用的。

就是啊 你在需要的地方释放就行了啊
Dispose被调用后,所占用的资源将释放;比如Connection对象Close后还可以再Open,而Dispose后再Open将出错,意思就是如果某个Connection对象被Dispose后可以判断处理不想让其出错,或者再实例化一个。而这个Dispose可能不是在自己代码里被调用的。 --------------------编程问答--------------------
引用 15 楼 guwei4037 的回复:
connection.State==ConnectionState.Closed  ??
这个只是对Open/Close而言的,对Dispose不适用。 --------------------编程问答-------------------- 可以 反编译看看 Dispose方法是怎么实现的,如 把 Connection设置为null或者某个值bool值,可以根据这个来判断。 --------------------编程问答--------------------
引用 楼主 chutao 的回复:
C#中如何判断一个对象Dispose了?

无法判断
除非你是用了IDispose接口显示释放搜索掉的从而设置类的属性IsDisposed为true,或者在析构函数中有设置一个类似于IsDisposed的属性值来供外界参考。
原因是,只有没有被任何变量引用的对象会被GC回收掉。正是因为这种机制,当一个对象满足回收条件时,程序员无法跟踪这个实际对象,而且即使你知道有这么个对象,也无法再程序中表示,因为它不被任何变量引用,孤独的占着堆上的一块内存等待被回收。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 13 楼 bf6543 的回复:
注册Disposed事件吧

这个可以,就是比较麻烦 --------------------编程问答-------------------- Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。 --------------------编程问答--------------------
引用 23 楼 qldsrx 的回复:
Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。

+1 --------------------编程问答--------------------
引用 23 楼 qldsrx 的回复:
Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。

+2 --------------------编程问答--------------------
引用 23 楼 qldsrx 的回复:
Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。

+1
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,