我应该在什么时候使用;使用;C#中的块?

我应该在什么时候使用;使用;C#中的块?,c#,.net,using,C#,.net,Using,是否存在我应该(或不应该?)使用“使用”块的特定实例: 当SomeType类实现时。在类型实现时使用,除非您无论如何都要将其包装在块中,否则您也可以(取决于您喜欢的外观)使用块。当SomeType实现IDisposable时 这向开发人员提供了一个线索,即某些类型使用了需要清理的非托管资源。在此上下文中,using语句对于实现IDisposable的类型非常方便。当代码块使用语句退出的作用域时,Dispose()被隐式调用。使用完要立即处理的对象后,这是一个好习惯。一种情况是,您希望在代码块的开

是否存在我应该(或不应该?)使用“使用”块的特定实例:


当SomeType类实现时。

在类型实现时使用,除非您无论如何都要将其包装在块中,否则您也可以(取决于您喜欢的外观)使用块。

当SomeType实现IDisposable时


这向开发人员提供了一个线索,即某些类型使用了需要清理的非托管资源。

在此上下文中,
using
语句对于实现IDisposable的类型非常方便。当代码块使用语句退出
的作用域时,
Dispose()
被隐式调用。使用完要立即处理的对象后,这是一个好习惯。

一种情况是,您希望在代码块的开头执行某项操作,然后在代码块的结尾无条件地撤消它(即使有抛出)

您构建(并在using中调用)的一次性类的ctor将执行该操作,然后Dispose方法将撤消该操作。这是我通常使用它的方式。

主要规则是: *当对象实现IDisposable接口时使用USING语句

此接口提供Dispose方法,该方法应释放对象的资源。如果未调用此方法,则对象将在内存中停留多长时间,因为CLR希望执行垃圾收集。如果程序员使用USING语句,那么最终对象将被释放,所有资源都将是免费的

所有不再使用的资源必须尽快免费使用,这一点非常重要


有关它的更多信息,请访问此链接:

其他人已经提到了“IDisposable”

但使用“using”语句时需要注意的一点是, 在“using”中抛出的任何异常都不会被捕获 即使是“某种类型”也会被处理

在下面的片段中

using (SomeType t = new SomeType()){
    throw new Exception("thrown within using");
}
抛出新异常(“在使用中抛出”)

示例:

        using(SqlConnection MyConnection = new SqlConnection("Connection string"))
        {
            MyConnection.Open();

            //...

            // 1. SQLConnection is a type that implements IDisposable
            // 2. So you can use MyConnection in a using statement
            // 3. When using block finishes, it calls Dispose method of 
            // SqlConnection class
            // 4. In this case, it will probably close the connection to 
            // the database and dispose MyConnection object

        }
您可以创建自己的实现IDisposable的对象:

public class MyOwnObjectThatImplementsIDisposable : IDisposable
{

    //... some code

    public void Dispose()
    {
        // Put here the code you want to be executed when the
        // using statement finish.
    }
}
因此,您可以在using语句中使用MyOwnObjectThanImplementsIDisposable类型的对象:

        using(MyOwnObjectThatImplementsIDisposable MyObject = new MyOwnObjectThatImplementsIDisposable)
        {

            // When the statement finishes, it calls the 
            // code you´ve writed in Dispose method
            // of MyOwnObjectThatImplementsIDisposable class
        }

希望这对您有所帮助

当您使用完某些对象后,需要执行一些操作。通常这是因为对象使用某种需要处理的资源。例如,如果有类file的file对象,并且该对象从文件系统打开一个文件,则需要再次关闭文件系统中的文件

如果您只是离开file对象,而忘记调用file.Close(),则在垃圾收集器(GC)运行并确定没有任何东西仍在使用file对象之前,不会清理它。垃圾收集器何时运行应由公共语言运行库(CLR)决定。如果在处理完文件后GC很长一段时间没有运行,那么该文件可能会保持打开状态很长一段时间。如果有很多文件对象,或者有东西想打开一个文件,但无法打开,这可能会造成一个大问题,因为您留下的文件对象仍然挂在周围

为了解决这个问题,C#具有IDisposable接口。这有一个名为Dispose的方法。需要一些清理的类实现此Dispose方法。这为您提供了清理任何使用资源的对象的标准方法。有很多类需要调用Dispose。问题在于,代码中包含了要Dispose的调用,而这些调用很难遵循,因为新创建对象和调用Dispose清理对象的位置是不同的。因此,您必须经常查看代码,并非常小心地检查是否有调用要在正确的位置进行处理

为了解决这个问题,C#引入了“using”关键字。您可以在新建对象的位置周围放置一个“using”关键字,这样可以确保为您调用Dispose。它保证不管发生什么,Dispose都会被调用。。。即使using语句的主体中抛出异常

因此,当您希望确保分配资源的对象将被清理时,应该使用“using”


using只能用于堆栈上声明的对象,即在函数中声明的对象。它不适用于声明为类成员的对象。对于他们,你必须自己打电话给他们。您可能必须在类中实现Dispose,以便in可以对其拥有的任何需要Dispose的成员对象调用Dispose


需要调用的常见对象有:文件、数据库连接、图形对象(如笔和画笔)


有时,当您希望两个操作同时进行时,也会使用它。例如,如果要在输入代码块和退出代码块时编写日志语句,可以编写一个日志类,如下所示:

using( Log log = new Log("Doing stuff") )
{
    // Stuff
}

可以让log类的构造函数写出消息,Dispose方法也可以写出消息。如果没有调用Dispose方法,请实现终结器(~Log)来断言,以确保在“新日志”中记住“using”。

当您应该使用
using
语句时,我看到很多其他答案。我想用
语句明确说明什么时候不应该使用

        using(MyOwnObjectThatImplementsIDisposable MyObject = new MyOwnObjectThatImplementsIDisposable)
        {

            // When the statement finishes, it calls the 
            // code you´ve writed in Dispose method
            // of MyOwnObjectThatImplementsIDisposable class
        }
如果需要在当前函数范围之外使用对象,请不要使用
using
块。很好的例子是返回数据库连接的工厂方法或需要返回datareader的方法。在这两种情况下,如果您使用
using
语句创建对象,它将在方法返回之前被释放,因此在方法之外不可用

现在,您仍然需要确保这些对象已被处置,
try
{
  //instantiate and use object
}
finally
{
  //dispose object
}