c# – 为什么处理对象不会抛出异常使用它?

前端之家收集整理的这篇文章主要介绍了c# – 为什么处理对象不会抛出异常使用它?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在被处置对象上调用方法是合法的吗?如果是,为什么?

在以下演示程序中,我有一个一次性类A(它实现了IDisposable接口).据我所知,如果我将一次性对象传递给using()构造,那么Dispose()方法会在结束括号中自动调用

A a = new A();
using (a)
{
   //...
}//<--------- a.Dispose() gets called here!

//here the object is supposed to be disposed,//and shouldn't be used,as far as I understand.

如果是正确的,那么请解释这个程序的输出

public class A : IDisposable
{
   int i = 100;
   public void Dispose()
   {
      Console.WriteLine("Dispose() called");
   }
   public void f()
   {
      Console.WriteLine("{0}",i); i  *= 2;
   }
}

public class Test
{
        public static void Main()
        {
                A a = new A();
                Console.WriteLine("Before using()");
                a.f();
                using ( a) 
                {
                    Console.WriteLine("Inside using()");
                    a.f();
                }
                Console.WriteLine("After using()");
                a.f();
        }
}

输出(ideone):

Before using()
100
Inside using()
200
Dispose() called
After using()
400

如何在被处理对象上调用f()?这是允许的吗?是的,那为什么?如果没有,那为什么上面的程序在运行时没有异常?

我知道使用使用的流行结构是这样的:

using (A a = new A())
{
   //working with a
}

但我只是在试验,所以我写的不同.

解决方法

处置并不意味着消失.处理仅意味着任何非托管资源(如文件,任何类型的连接…)已被释放.虽然这通常意味着该对象不提供任何有用的功能,但是仍然可能存在不依赖于该非托管资源的方法,并且照常工作.

处理机制存在.net(并继承,C#.net)是一个垃圾回收的环境,这意味着你不负责内存管理.但是,垃圾收集器无法决定是否使用非托管资源,因此您需要自己做.

如果您想要方法在对象抛出后抛出异常,则需要一个布尔值来捕获处理状态,一旦对象被处理,您将抛出异常:

public class A : IDisposable
{
   int i = 100;
   bool disposed = false;
   public void Dispose()
   {
      disposed = true;
      Console.WriteLine("Dispose() called");
   }
   public void f()
   {
      if(disposed)
        throw new ObjectDisposedException();

      Console.WriteLine("{0}",i); i  *= 2;
   }
}

猜你在找的C#相关文章