1

以下不起作用:

    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

4 回答 4

4

请参阅使用 C#

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

由于Random未实现System.IDisposable,这就是您收到错误的原因。

来自MSDN

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

于 2012-07-11T07:33:02.173 回答
1

using可以在实现IDisposable.

以这种方式实现的 Dispose(..) 方法将在程序执行跳出using块时立即执行。

try/finally编译器注入的构造的“别名”仅此而已IL

于 2012-07-11T07:33:06.900 回答
1

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

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

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

于 2012-07-11T07:34:06.840 回答
0

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

以下代码示例是等效的:

(1) using 语句:

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

(2) 分finally块配置:

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

正如你所看到的,所有 using 语句实现的都是对象的处置,因此如果你的对象没有实现 IDisposable 是没有意义的。

FXCop有一个规则来检查您是否使用了针对您的类型using的语句。IDisposable请参阅此 StackOverflow 问题,了解查找哪些类型实现IDisposable并可以在 using 语句中使用的其他方法。

有关详细信息,请参阅MSDN 文档

于 2012-07-11T07:36:15.723 回答