为什么可以在超出范围后访问构造函数参数?
Why is it possible to access a constructor parameter after it becomes out of scope?
为什么可以在下面的示例中调用 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);
}
}
因为您在 lambda 中访问此参数
() = > loggerFactory.GetLogger("TestLogger");
编译器会创建一些额外的代码来捕获该变量。它看起来像这样:
public class TestClass
{
/* your fields here */
// created by compiler
private ILoggerFactory anonymousField;
private ILogger AnonymousMethod()
{
return anonymousField.GetLogger("TestLogger");
}
public TestClass(ILoggerFactory loggerFactory)
{
// save field
this.anonymousField = loggerFactory;
// use instance method instead with captures anonymousField
this.lazyLogger = new Lazy<ILogger>(AnonymousMethod);
}
如评论中所述,实际上生成了一个全新的 class,它声明了匿名方法并将所有必要的变量作为字段。但这是基本的想法。
为什么可以在下面的示例中调用 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);
}
}
因为您在 lambda 中访问此参数
() = > loggerFactory.GetLogger("TestLogger");
编译器会创建一些额外的代码来捕获该变量。它看起来像这样:
public class TestClass
{
/* your fields here */
// created by compiler
private ILoggerFactory anonymousField;
private ILogger AnonymousMethod()
{
return anonymousField.GetLogger("TestLogger");
}
public TestClass(ILoggerFactory loggerFactory)
{
// save field
this.anonymousField = loggerFactory;
// use instance method instead with captures anonymousField
this.lazyLogger = new Lazy<ILogger>(AnonymousMethod);
}
如评论中所述,实际上生成了一个全新的 class,它声明了匿名方法并将所有必要的变量作为字段。但这是基本的想法。