何时应该使用Using语句

本文关键字:Using 语句 何时应 | 更新日期: 2023-09-27 18:16:46

很多人在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语句?

何时应该使用Using语句

你的问题已经触及到答案了。

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

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

只要类实现了IDisposable接口,就应该使用using语句。

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

检查方法:在Visual Studio中右键单击类名,选择Go To Declaration,在对象浏览器中打开它。然后,您可以轻松地检查类或其基类型是否实现了IDisposable。

In

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

R应该实现IDisposing接口。

最简单的方法是查看对象是否实现了IDisposable接口。因此,右键单击有问题的对象/类,从下拉菜单中选择Go to Definition(或按F12),并查看类是否实现了IDisposable。注意,在实现许多接口/其他类的类中,您可能需要实际检查这些类,看看它们是否也实现了IDisposable。

大多数时候,我不会首先检查一个类是否实现了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,它是可用的;它干净,简洁,你得到了广告上的处理和清理。好了!