使用声明;为什么我的字段没有设置为null?

时间:2011-01-20 09:38:58

标签: c# using keyword

我正在尝试使用“using”来最小化实体框架连接上下文范围,而同时我希望能够将一个上下文注入到我的类中。 我在互联网上搜索但没有找到像我这样的情况,或者我只是做错了什么,无论如何,这里是代码:

[TestFixture]
public class Dummy
{
  private IFoo ifoo;
  [Test]
  public void CreateIfNotExist()
  {
    using (var foo = GetNewIFoo())
    {
      foo.Dosomething();
    }
    Assert.IsNull(ifoo);//test fail here
  }

  [Test]
  public void NotCreateIfExist()
  {
    ifoo = new Bar();
    using (var foo = GetNewIFoo())
    {
      foo.Dosomething();
    }
    Assert.IsNull(ifoo);//test fail here
  }

  private IFoo GetNewIFoo()
  {
    if (ifoo == null)
    {
     ifoo = new Foo();//return new Foo();
    }
    return ifoo;
  }
}

第一次测试失败,创建了foo的对象序列 - > foo做某事 - > foo处置(使用on foo调用),而状态变量ifoo仍然是Foo()的类型。

第二次测试失败,对象生命序列与之前相同。

我很困惑,因为我认为GetNewIFoo()会返回ifoo的引用,而使用关键字只会在ifoo上调用dispose?

另外,有没有什么好方法可以控制上下文范围,同时保持注入IContext的能力?

2 个答案:

答案 0 :(得分:6)

调用Dispose() 不会清除引用(也不会执行垃圾回收)。它只是调用Dispose()方法,它可以(例如)关闭连接,文件等 - 具体取决于实现。对象可以是非null并且仍然处理。某些对象允许您查看对象是否被处置;大部分都没有。

一般来说,如果你是using某事,你就不会在其他地方写这个变量(也就是说你不会把它写成某个地方的字段)。

答案 1 :(得分:4)

如果下一个是using块,则含义:

using (var foo = GetNewIFoo())
{
    foo.Dosomething();
} // foo.Dipose() will be called automatically

与:

相同
var foo = GetNewIFoo())
try
{
    foo.Dosomething();
}
finally
{
    foo.Dipose();
}

foo null using之后using (var foo = GetNewIFoo()) { foo.Dosomething(); } //^ nothing below affects ifoo!! Assert.IsNull(ifoo); // so why reference should be null?? 不是{{1}},但它被处理掉了。


此外:

{{1}}