什么时候应该使用Using语句?

时间:2011-12-02 00:43:30

标签: c# using-statement

很多人在SO上指出我应该更频繁地使用using语句。所以我在练习。

问题在于我无法决定何时使用它以及何时不使用它。当我认为我应该使用它时,我会收到错误,例如在这个例子中(PS.HashPhrase是我创建的类):

        using (HashPhrase hash = new HashPhrase())
        {
            connection.ConnectionString =
                "Provider=Microsoft.ACE.OLEDB.12.0;" +
                "Data Source=" + filePath + ";" +
                "Persist Security Info=False;" +
                "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";";
        }

但它给了我一个错误:'Password_Manager.HashPhrase': type used in a using statement must be implicitly convertible to 'System.IDisposable'

但是在这个例子中它可以正常工作:

    using (OleDbConnection connection = new OleDbConnection())
    {
        connection.ConnectionString =
            "Provider=Microsoft.ACE.OLEDB.12.0;" +
            "Data Source=" + filePath + ";" +
            "Persist Security Info=False;" +
            "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";";

        using (OleDbCommand command = new OleDbCommand(sql, connection))
        {
            try
            {
                connection.Open();
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }
    }

是否有快速指导如何确定何时应使用using语句?

5 个答案:

答案 0 :(得分:15)

您的问题已触及答案。

如果类型实现了IDisposable接口,那么你应该尽可能地使用using(也就是说,除非有令人信服的理由不这样做)。

如果类型没有实现IDisposable那么你就不能使用using,编译器就会告诉你,正如你已经发现的那样。

答案 1 :(得分:5)

每当类实现IDisposable接口时,都应该使用using语句。

这是将对象包装在try-finally块中的简写,以确保始终调用对象的Dispose方法来释放任何资源,无论是否抛出异常。

要检查,请右键单击Visual Studio中的类名,然后选择转至声明以在对象浏览器中将其打开。然后,您可以轻松检查类或其基类型是否实现IDisposable。

答案 2 :(得分:4)

using (var r = new R())
{
   // use r
}

R应该实现IDisposing接口。

答案 3 :(得分:3)

最简单的方法是查看对象是否实现了IDisposable接口。因此,右键单击相关的对象/类,从下拉列表中选择“转到定义”(或按F12),然后查看该类是否实现了IDisposable。注意,在实现许多接口/其他类的类中,您可能需要实际检查这些类以查看它们是否也实现了IDisposable。

答案 4 :(得分:-1)

在大多数情况下,我不首先检查类是否实现IDisposable(因为它可能被埋在基类中),如果我认为有意义,我只是编写一个Using块,如果编译失败,我会回退到标准构造。懒?是的,一点。但这可以更快。

例如,VB:

Using oSerializer As XmlSerializer = New XmlSerializer(GetType(MyType))
    ...
End Using

例如,C#:

using (XmlSerializer serializer = new XmlSerializer(typeof(MyType)))
{
    ...
}

尽管我认为这应该是可能的,但是上述两个片段实际上都无法编译,因为XmlSerializer没有实现IDisposable(我觉得有点奇怪诚实地考虑到XmlReaderXmlWriter这样的关联类可以实现IDisposable

因此,您可以回滚到标准构造。

VB:

Dim oSerializer As XmlSerializer = New XmlSerializer(GetType(MyType))
...

C#:

XmlSerializer serializer = new XmlSerializer(typeof(MyType));
...

我当然同意在可用的地方使用Using;它干净,简洁,您将得到广告宣传中的处置和清理方法。很好!