C#中如何判断一个对象Dispose了?
C#中如何判断一个对象Dispose了? --------------------编程问答-------------------- obj.IsDisposed ? --------------------编程问答-------------------- if this.IsDisposed --------------------编程问答-------------------- 没有这个IsDisposed哦??? --------------------编程问答-------------------- 没有这个IsDisposed哦 --------------------编程问答-------------------- if(objectName is null)XXX --------------------编程问答-------------------- 对象在dispose后不一定就是null啊 --------------------编程问答-------------------- 楼上的IsDisposed可以的啊,你准备判断什么对象 --------------------编程问答-------------------- 你是怎么用的?比如数据的连接对象OracleConnection 调用Dispose后怎么判断其已经Dispose了?
Oracle.ManagedDataAccess.Client --------------------编程问答-------------------- 我没用过OracleConnection,我用的sql
不过原理都差不多
SqlConnection中有个State的属性,我会判断它是关闭,打开,或则是损坏等状态,根据这个状态修正SqlConnection到自己需要的状态 --------------------编程问答-------------------- SqlConnection也一样;State对应的是Open()/Close();SqlConnection对象dispose后也是没办法判断? --------------------编程问答-------------------- 貌似C#的对象Dispose释放后,没有办法判断已经Dispose了?只是就仅仅释放不可用,没法判断? --------------------编程问答-------------------- 楼主判断 Dispose了 ,有何用? 这个 Dispose方法是可以重复调用的。 --------------------编程问答-------------------- 注册Disposed事件吧 --------------------编程问答--------------------
就是啊 你在需要的地方释放就行了啊 --------------------编程问答-------------------- connection.State==ConnectionState.Closed ?? --------------------编程问答-------------------- Dispose被调用后,所占用的资源将释放;比如Connection对象Close后还可以再Open,而Dispose后再Open将出错,意思就是如果某个Connection对象被Dispose后可以判断处理不想让其出错,或者再实例化一个。 --------------------编程问答-------------------- Dispose被调用后,所占用的资源将释放;比如Connection对象Close后还可以再Open,而Dispose后再Open将出错,意思就是如果某个Connection对象被Dispose后可以判断处理不想让其出错,或者再实例化一个。而这个Dispose可能不是在自己代码里被调用的。 --------------------编程问答--------------------
connection.State==ConnectionState.Closed ??
C#中如何判断一个对象Dispose了?
无法判断
除非你是用了IDispose接口显示释放搜索掉的从而设置类的属性IsDisposed为true,或者在析构函数中有设置一个类似于IsDisposed的属性值来供外界参考。
原因是,只有没有被任何变量引用的对象会被GC回收掉。正是因为这种机制,当一个对象满足回收条件时,程序员无法跟踪这个实际对象,而且即使你知道有这么个对象,也无法再程序中表示,因为它不被任何变量引用,孤独的占着堆上的一块内存等待被回收。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
注册Disposed事件吧
这个可以,就是比较麻烦 --------------------编程问答-------------------- Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。 --------------------编程问答--------------------
Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。
+1 --------------------编程问答--------------------
Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。
+2 --------------------编程问答--------------------
Dispose方法本事不代表对象的回收,只是在这个方法内部处理对象额外占用资源的回收,而对象自己的回收要等到对象没有任何引用才会被GC处理,因此你无法知道Dispose是否被调用过,也不需要知道,除非是带有相关属性让你可以获知,没有相关属性用来判断的,一般都是不需要用户知道的,而且一般是GC回收时才需要调用的,非手工调用。
至于数据库连接你根本没必要判断是否Dispose,因为那个本身就是重用的,每次处理后务必Dispose,新的数据库操作务必new一个新的连接出来执行,看似是新增了一个连接,其实底层自动重用上次的连接,它内部有连接池缓存的。
+1
补充:.NET技术 , C#