использование заявления; почему мое поле не установлено в ноль? - PullRequest
2 голосов
/ 20 января 2011

Я пытаюсь минимизировать область контекста соединения с платформой сущностей, используя «использование», в то время как в то же время я хочу иметь возможность внедрить контекст в мой класс. Я искал в интернете, но не нашел дела, похожего на мое, или я просто делаю что-то не так, в любом случае вот код:

[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 do что-то-> foo disposed (вызывается с помощью on foo), тогда как переменная состояния ifoo по-прежнему имеет тип Foo ().

Второй тест не пройден, последовательность жизни объекта такая же, как и раньше.

Я запутался, так как думал, что GetNewIFoo () вернет ссылку на ifoo, а использование ключевого слова просто вызовет dispose для ifoo?

Кроме того, есть ли хороший способ контролировать контекстную область, сохраняя при этом возможность внедрения IContext?

Ответы [ 2 ]

6 голосов
/ 20 января 2011

Вызов Dispose() не очищает ссылки (и не выполняет сборку мусора).Он просто вызывает метод Dispose(), который может (например) закрывать соединения, файлы и т. Д. - в зависимости от реализации.Объект может быть ненулевым и все еще расположен.Некоторые объекты позволяют увидеть, расположен ли объект;большинство этого не делают.

Как правило, если вы using чем-то, вы не напишите эту переменную где-то еще (то есть вы не напишите ее как поле).

4 голосов
/ 20 января 2011

Значение, если блок 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??
...