Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该使用什么类的C#&x27;什么在使用语句?_C#_Using Statement - Fatal编程技术网

我应该使用什么类的C#&x27;什么在使用语句?

我应该使用什么类的C#&x27;什么在使用语句?,c#,using-statement,C#,Using Statement,我已经阅读并相信我理解了C#的using语句的作用(如果我错了,请纠正我):将IDisposable对象初始化为只读到有限的范围(使用块)。我知道您可以使用在之前进行初始化,这并不限制范围,但建议您不要在此处进行初始化: 我并不总是关注什么类是什么的子类。我不太确定哪些类继承自IDisposable。我不仅好奇在using语句中可以使用哪些类,而且我的同事希望在using块中找到哪些类?使用块时,应该在中包含哪些类?另外,不使用使用块而不调用Dispose真的有什么不对吗?它只是关于内存还是稳

我已经阅读并相信我理解了C#的
using
语句的作用(如果我错了,请纠正我):将IDisposable对象初始化为只读到有限的范围(使用
块)。我知道您可以使用
之前进行初始化,这并不限制范围,但建议您不要在此处进行初始化:


我并不总是关注什么类是什么的子类。我不太确定哪些类继承自IDisposable。我不仅好奇在
using
语句中可以使用哪些类,而且我的同事希望在
using
块中找到哪些类?使用
块时,应该在
中包含哪些类?另外,不使用
使用
块而不调用Dispose真的有什么不对吗?它只是关于内存还是稳定性?

至少,所有使用非托管资源的类都与内存无关。它涉及其他资源,如文件句柄、数据库连接等


基本上,如果一个类实现了
IDisposable
,那么这就是一个信号,表明您应该在完成后处理它,因为它可能具有非托管资源,而保留这些资源的成本很高。(例如,您的连接池可能会耗尽连接,或者文件句柄将保持打开状态,从而阻止另一段代码再次打开同一文件)。

不使用using块和不调用Dispose绝对是错误的,您很可能会泄漏内存和/或资源。使用是一种方便,但您确实应该在任何从IDisposable派生的类的对象中调用Dispose。

您不必担心使用块下的类。如果您使用的underusing语句没有实现IDisposbale,那么它将显示红/蓝波浪。因此,您可以来到knwo,了解其缺少idisposable接口。就我所使用的而言,几乎所有的框架类都实现了Idisposable。但在定制类中,您需要实现

,只要哪些类是可丢弃的,您就可以自己探索intellisense,或者从经验中学习。一些常见的工具包括
Image
及其子工具,实际上是大部分
系统。绘图
命名空间、大量文件流、数据库连接等

至于什么时候应该叫它-尽快。如果你知道它是一次性的,并且你知道你已经用完了,那么打电话给Dispose

我相信许多实现IDisposable的.NET基类实现了一次性模式,这意味着当垃圾收集器来获取它们时,它们将被正确地处理掉。但即便如此,你还是应该在做完事情后处理掉,因为

  • 您可能会留下一个参考(泄漏)而不会被处理,或者
  • GC可能暂时不会出现

  • 此外,对于您自己编写的类,垃圾收集并不等同于对非托管资源的正确处理——这是一种常见的混淆。一次性模式需要自己实现。

    类实现IDisposable的主要原因是释放非托管资源。垃圾收集器将在托管资源超出范围时释放它们,但它不知道非托管资源。调用Dispose方法将显式释放资源

    如果不使用
    using
    块或调用
    Dispose
    方法,则会出现内存泄漏问题,进而可能导致稳定性问题

    在处理实现了
    IDisposable
    的类时,应该始终使用
    using
    块。尽管您可能更喜欢
    试试。。抓住。。最后
    确保在
    Finally
    块中调用
    Dispose
    ,以便处理异常

    对于任何实现了
    IDisposable
    的类,都应该始终调用
    Dispose
    ,这可以通过
    使用
    块轻松完成

    这不仅仅是关于记忆。这也不仅仅是资源问题。这是关于正确性的

    StreamWriter
    就是一个著名的例子。微软甚至开发出了一种方法来解决程序员忘记调用
    Dispose
    的情况。这不仅仅是内存或资源:在
    StreamWriter
    示例中,正在写入的文件可能会被截断

    有一次我不得不追踪一个讨厌的bug(实际上是在我老板的代码中),其中一个数据库事务正在回滚。。。原来原因是没有调用
    Dispose
    ,因此当进程退出时,它试图向磁盘提交太多内容(进程退出期间终结器超时)。修复只使用了几个

    第三个示例:Microsoft的托管ESENT包装类有一个“三层”处理方案,要求以正确的顺序调用
    Dispose
    (“外部”类)

    因此,有三个真实的例子,如果没有正确调用
    Dispose
    ,将导致不正确的行为。其他类可能存在类似的行为


    作为一般规则,您应该始终调用
    Dispose

    严格来说,任何实现
    IDisposable
    且其范围仅限于该函数的对象都应该在
    using
    块中。
    IDisposable
    接口允许处理非托管资源(数据库连接、文件句柄、窗口句柄等)的类及时、确定地处置这些资源

    通常,类中使用
    IDisposable
    对象的方式有三种:

  • 在单个方法调用的范围内,对象已创建且不再需要。这是很常见的,当
    u
    
    var disposable = new MemoryStream();
    try
    {
      //do some work with the disposable object
    }
    finally
    {
      if (disposable!=null)
         disposable.Dispose();  
    }