c# - 使用语句;为什么我的字段没有设置为空?

标签 c# using keyword

我正在尝试使用“使用”最小化 Entity Framework 连接上下文范围,同时我希望能够将上下文注入(inject)我的类。 我在互联网上搜索但没有找到像我这样的案例,或者我只是做错了什么,无论如何,这是代码:

[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 created->foo do something->foo disposed(called by using on foo) 而状态变量 ifoo 仍然是 Foo() 类型。

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

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

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

最佳答案

调用 Dispose() 不会清除引用(也不执行垃圾收集)。它只是调用 Dispose() 方法,该方法可以(例如)关闭连接、文件等——具体取决于实现。一个对象可以是非空的并且仍然被释放。有些对象允许您查看一个对象是否被处置;大多数不会。

通常,如果您正在使用 某些东西,您不会将该变量写在其他地方(即您不会将它写为某个地方的字段)。

关于c# - 使用语句;为什么我的字段没有设置为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4745468/

相关文章:

Visual Studio 2003 不支持 C# ParameterizedThreadStart?

c++ - ADL 是否适用于全局 namespace ?

c# - C# 与 VB.Net 中的命名空间引用

mysql - SQL 使用列值作为查询字符串中的关键字

c++ - 头文件中的 'keyword' 短语有什么作用?

c# - 为什么只在线程访问UI控件时在调试时出现异常?

c# - 为什么 SCOPE_IDENTITY() 返回 -1?

c# - 为什么 FileSystemWatcher 检测不到来自 Visual Studio 的更改?

c# - 如何从一个方法返回一个流,知道它应该被释放?

php - 在 PHP 中替代 'or' 关键字