아래 예제에서 SomeMethod() 메서드를 호출하는 것이 좋은 이유는 무엇입니까?범위를 벗어난 생성자 매개 변수에 액세스 할 수있는 이유는 무엇입니까?
은 내가 로거 속성에 액세스하려고 할 때 생성자 매개 변수 loggerFactory 더 이상 사용할 수없는 것이라고 생각합니다. 나는이 기능을 사용하고
나는 lazyLogger 필드를 설정,하지만 난이 로거 속성을 호출 할 때이 종류의 예외를 던질 것이라고 생각합니다.
하지만 모든 것이 잘 작동합니다. 이것은 CLR/C#이 어떻게 작동하는지에 대한 오해 일 수 있습니다.
왜 이렇게 작동하는지 설명해 주시면 감사하겠습니다. 당신이 람다
() = > loggerFactory.GetLogger("TestLogger");
컴파일러 내부에이 매개 변수를 액세스하는 때문에
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, 내가 ** 클로저한다고 말하면 ** 그게 무슨 뜻이야? –