Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用(object obj=new object())意味着什么?_C#_.net_Using Statement - Fatal编程技术网

C# 使用(object obj=new object())意味着什么?

C# 使用(object obj=new object())意味着什么?,c#,.net,using-statement,C#,.net,Using Statement,这句话在C#中是什么意思 这意味着obj实现了idisposable,并将在之后使用块正确处理。它的功能与: { //Assumes SomeObject implements IDisposable SomeObject obj = new SomeObject(); try { // Do more stuff here. } finally { if (obj != null) { ((IDisposable)

这句话在C#中是什么意思


这意味着
obj
实现了
idisposable
,并将在
之后使用
块正确处理。它的功能与:

{
  //Assumes SomeObject implements IDisposable
  SomeObject obj = new SomeObject();
  try
  {
    // Do more stuff here.       
  }
  finally
  { 
    if (obj != null)
    {
      ((IDisposable)obj).Dispose();
    }
  }
}
相当于:

object obj = new object();
try 
{
    // random stuff
}
finally {
   ((IDisposable)obj).Dispose();
}

这是一种确定对象范围的方法,以便在退出时调用dispose方法。它对于particuler中的数据库连接非常有用。如果对象未使用实现idisposable

,则会发生编译时错误。确保分配的对象在using块后得到正确处理,即使块中发生未处理的异常也是如此。

为什么存在该异常

它存在于您关心其生命周期的类中,特别是当该类在操作系统中包装了一个资源并且您希望立即释放它时。否则,您将不得不等待CLR的(非确定性)终结器


例如,文件句柄、数据库连接、套接字连接等等。

噢!美好的谢谢你的回答。几乎正确,使用()并不意味着catch语句,只意味着try/finally。@Jay Zeng,就像在图形中一样?如果我在“using”语句中使用图形,则不需要dispose?并且编译器会插入一个检查,以确保如果变量为可空类型,则该值不为null。没有人提到它还通过调用.dispose方法在右大括号处“接触”对象。这意味着垃圾收集器在.Dispose()几乎相等之前不会接触对象。在第一个示例中,obj在}处超出范围。第二,它仍在范围之内。类似于for while等效。为了供您将来参考,这在C#规范的第8.13节中有记录。我不同意-这是一种众所周知的模式,因此鼓励常见的良好实践。for loop也是语法上的sugar-但它总是被使用,因为它是一个常见的习语,我还试图解释为什么会使用它-以及为什么会使用非sugar版本
using (object obj = new object())
{
    //random stuff
}
object obj = new object();
try 
{
    // random stuff
}
finally {
   ((IDisposable)obj).Dispose();
}