私の例でSomeMethod()メソッドを呼び出すのはなぜですか?コンストラクタパラメータが有効範囲外になった後、コンストラクタパラメータにアクセスできるのはなぜですか?
は私がロガープロパティがアクセスしようとしたとき、コンストラクタのパラメータloggerFactoryが使用できなくと思うだろう。
私はlazyLoggerフィールドを設定したとき、私は、関数を使用していますが、私はロガープロパティを呼び出すとき、それは一種の例外をスローするだろうと思いました。
しかし、すべてうまく動作します。 これは、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'コンストラクタに渡されたデリゲートの 'loggerFactory'をクローズしています。 –
Lee
ねえ、貴重品を箱に入れて、その箱を誰かに渡せば、どうやって貴重品を手に入れましたか?私は彼にそれらを与えなかった、私は彼に箱を与えた! –
@Lee、私が**閉鎖していると言ったら**、それはどういう意味ですか? –