微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;
   }
}

原文地址:https://www.jb51.cc/csharp/95368.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐