以下不起作用:
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
更好地声明的类型列表?
答案 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;
答案 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。