使用"using"关键字时会被处置的内容

use*_*348 3 .net c# using

我们举个例子:

using (var someObject = new SomeObject())
{
    var someOtherObject = new SomeOtherObject();
    someOtherObject.someMethod(); 
}
Run Code Online (Sandbox Code Playgroud)

SomeOtherObject还实现了IDisposable.当SomeObject被处置时,SomeOtherObject也会被处理掉吗?SomeOtherObject会发生什么?(在SomeObject的Dispose方法中没有实现处理SomeOtherObject)

mun*_*sor 11

不会.只会处理using子句中的字段.在你的情况下只有someObject.

基本上代码被翻译成了

var someObject = null;
try
{
  someObject = new SomeObject()

  var someOtherObject = new SomeOtherObject();
  someOtherObject.someMethod(); 
}
finally
{
  if (someObject != null )
  someObject.Dispose()
}
Run Code Online (Sandbox Code Playgroud)

  • 注意someObject = new SomeObject()在try块之前放置! (2认同)

Hen*_*man 5

不,SomeOtherObject不会被处理完毕.

您的代码由编译器重构,如下所示:

var someObject = new SomeObject();
try
{
    var someOtherObject = new SomeOtherObject();
    someOtherObject.someMethod(); 
}
finally
{
    if (someObject != null)
        someObject.Dispose();
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*kov 5

不会处理someOtherObject.

你的代码会像这样翻译:

var someObject = new SomeObject();
try
{
   var someOtherObject = new SomeOtherObject();
   someOtherObject.someMethod(); 
}
finally
{
    ((IDisposable)someObject).Dispose();
}
Run Code Online (Sandbox Code Playgroud)

因此,不会对任何新创建的对象执行额外调用.