仅对特定类型使用?

时间:2012-07-11 07:30:33

标签: c# scope

以下不起作用:

    public string foo()
    {
        using (Random myRandomChoice = new Random())
        {
            return myRandomChoice.Next(10).ToString();
        }
    }

以下是错误:

    public string foo()
    {
        Random myRandomChoice = new Random();
        return myRandomChoice.Next(10).ToString();
    }

第一个foo的错误消息涉及Random无法隐式转换为System.IDisposable

这是一个故意用语言语法的策略,所以你只在特定情况下使用using,例如在处理数据库连接时?或者我可以明确地将Random转换为IDisposable类型,以便初始foo有效吗?

是否有可用using更好地声明的类型列表?

4 个答案:

答案 0 :(得分:4)

请参阅using C#

  

提供给using语句的对象必须实现   IDisposable接口。这个接口提供了Dispose方法,   哪个应该释放对象的资源。

由于Random未实现System.IDisposable,因此您就会收到错误。

来自MSDN

  

通常,当您使用IDisposable对象时,您应该声明和   在using语句中实例化它。 using语句调用   以正确的方式处理对象上的方法,以及(当您使用它时)   如前所示)它也会导致对象本身超出范围   只要调用Dispose。在使用块中,对象是   只读,无法修改或重新分配。

答案 1 :(得分:1)

using可以在实现IDisposable的类型上执行。

通过这种方式在上实现了Dispose(..)方法,只要程序执行跳出using块,就会执行类型。

它只是try/finally构造的“别名”,由IL中的编译器注入

答案 2 :(得分:1)

using是一种更好的语法方法,可以在IDisposable上调用dispose(可能在try-finally中):

  

using语句确保即使调用Dispose也会调用   在对象上调用方法时发生异常。您可以   通过将对象放在try块中来实现相同的结果   然后在finally块中调用Dispose;

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

答案 3 :(得分:0)

using语句是一种保证即使抛出异常也会在对象上调用Dispose的方法。因此,当对象未实现IDisposable时,它就毫无意义。

以下代码示例是等效的:

(1)使用声明:

using (MyClass myObj = new MyClass())
{
    ...
}

(2)处置finally块:

try
{
    MyClass myObj = new MyClass();
    ...
}
finally
{
    myObj.Dispose();
}

正如您所看到的,所有using语句都实现了对象的处理,因此如果对象没有实现IDisposable则没有任何意义。

FXCop有一条规则,用于检查您是否使用了using类型的IDisposable语句。有关查找哪些类型实现IDisposable并可在using语句中使用的其他方法,请参阅this StackOverflow question

有关详细信息,请参阅MSDN documentation