【发布时间】:2018-06-03 07:29:52
【问题描述】:
为什么可以在下面的示例中调用 SomeMethod() 方法?
我认为构造函数参数 loggerFactory 在 Logger 属性尝试访问它时将不再可用。
我在设置 lazyLogger 字段时使用了一个函数,但我认为当我调用 Logger 属性时它会抛出某种异常。
但一切正常。 这可能只是我对 CLR/C# 工作原理的误解。
我希望能解释一下它为什么会这样工作。
public class TestClass
{
private readonly Lazy<ILogger> lazyLogger;
private ILogger Logger => this.lazyLogger.Value;
public TestClass(ILoggerFactory loggerFactory)
{
this.lazyLogger = new Lazy<ILogger>(() = > loggerFactory.GetLogger("TestLogger"));
}
public void SomeMethod()
{
this.Logger.Info("Test Log Message"); //Why is it okay to call this method? The constructor parameter shouldn't be available anymore, right?
}
}
public interface ILoggerFactory
{
ILogger GetLogger(string name);
}
public interface ILogger
{
void Info(string message);
}
public class TestLoggerFactory : ILoggerFactory
{
public ILogger GetLogger(string name)
{
return new TestLogger(name);
}
}
public class TestLogger : ILogger
{
public void Info(string message)
{
Console.WriteLine(message);
}
}
【问题讨论】:
-
在传递给
Lazy<ILogger>构造函数的委托中,您正在关闭loggerFactory。 -
嘿,如果我把我的贵重物品放在一个盒子里然后把那个盒子给别人,他是怎么拿到我的贵重物品的?我从来没有给过他,我只给了他一个盒子!
-
@Lee,当你说我结束时,你是什么意思?