如何在局部作用域隐藏静态变量,同时仍可访问类的静态变量?
在局部作用域中访问被遮蔽的类静态变量
这个问题其实很简单——你只需要明确指定静态变量所属的类,就能绕过局部变量的遮蔽(shadowing)问题。
你的代码里,类的静态Log变量之所以看起来“无法访问”,是因为局部作用域里的同名变量Log遮蔽了它,但只要在访问时加上类名前缀,就能直接访问类级别的静态成员。
修正后的示例代码
public class MyClass { private static readonly MyLogger.ILog Log = MyLogger.LogManager.GetLogger(typeof(MyClass)); private void DoSomethingLogged() { var Log = MyLogger.LogManager.GetLogger(MyClass.Log.Name + "::" + nameof(DoSomethingLogged)); // 使用局部作用域的Log Log.Info("method called"); // 明确指定类名,访问类的静态Log MyClass.Log.Info("通过类静态日志记录方法执行"); } }
关键原理
局部变量会优先遮蔽同名的外部(类级)变量,但这种遮蔽是作用域层面的。对于静态成员,只要通过类名.静态成员名的方式明确引用,就能直接绕过局部作用域的变量,访问到类的静态成员。如果是实例成员(非静态),则可以用this.成员名来绕过局部遮蔽,但静态成员必须使用类名前缀来访问。
内容的提问来源于stack exchange,提问作者enorl76
相关产品推荐
相关产品推荐

