我正在尝试在另一个类中调用静态变量的 getter。有人可以告诉我为什么会这样:
protected static SymTab _symTab;
public SymTab symTab
{
get{return _symTab;}
set{_symTab = value;}
}
这不会:
public static SymTab symTab {get; protected set;}
第一个版本有一个实例属性,它获取/设置一个静态变量。
第二个版本有一个静态属性,它获取/设置一个静态变量。(二传手也受到保护,但这似乎不是您的直接问题。)
我强烈反对第一种形式——实例属性应该反映该实例的某些内容;您不会期望在一个实例上设置一个属性来更改另一个实例的属性值。
使用第二种形式,您可以使用:
SymTab currentTab = TypeName.symTab;
代替:
SymTab currentTab = someVariable.symTab;
另外,我要注意:
symTab
违反 .NET 命名约定SymTab
不如SymbolTable
该缩写的缩写那样清晰编辑:请注意,现在我们知道它来自 Java,这解释了您所看到的问题。在 Java 中,“通过”变量或其他表达式引用静态成员是合法的(但不是一个好主意)。不过,这会导致代码非常混乱。例如:
Thread backgroundThread = new Thread(someRunnable);
backgroundThread.start();
backgroundThread.sleep(1000);
这看起来像是在告诉新线程休眠,但实际上Thread.sleep
它是对导致当前线程休眠的静态方法的调用。一些 Java IDE 会选择性地将其标记为警告或错误。
幸运的是,C# 一开始就不允许这样做。
有两个区别:
在第一种情况下,symTab
属性(考虑将其命名为 SymTab,以遵循约定)作为实例属性。第二,它是静态的。所以MyClass.symTab
将在第二种情况下工作,而不是在第一种情况下,myInstance.symTab
反之亦然。
在第一种情况下,属性的 getter 和 setter 都是公共的,而在第二种情况下,只有 getter 是公开的,并且 setter 是受保护的。
使用第一个解决方案,您有一个公共设置,后面有一个受保护的静态变量,而使用第二个解决方案,您已经获得了一个受保护的 setter。