我正试图在另一个类中调用静态变量的getter。有人可以告诉我为什么这样做:
protected static SymTab _symTab;
public SymTab symTab
{
get{return _symTab;}
set{_symTab = value;}
}
而这不是:
public static SymTab symTab {get; protected set;}
答案 0 :(得分:4)
第一个版本有一个实例属性,用于获取/设置静态变量。
第二个版本有一个 static 属性,用于获取/设置静态变量。 (设置者也受到保护,但这似乎不是你当前的问题。)
我强烈反对第一个表单 - 实例属性应反映该实例的某些内容;您不希望在一个实例上设置属性来更改其他实例的属性值。
使用第二种形式,您可以使用:
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
方法的调用,导致< em>当前线程要睡觉。某些Java IDE会选择将其标记为警告或错误。
幸运的是,C#首先不允许这样做。
答案 1 :(得分:1)
有两点不同:
在第一种情况下,symTab
属性(考虑将其命名为SymTab,遵循约定)作为实例属性。在第二个,它是静态的。因此,MyClass.symTab
将适用于第二种情况,而不适用于第一种情况,而myInstance.symTab
将适用于其他情况。
在第一种情况下,属性的getter和setter都是公共的,而在第二种情况下,只有getter是,而setter是受保护的。
答案 2 :(得分:0)
使用第一个解决方案,您在后面有一个带有受保护静态变量的公共设置,在第二个解决方案中,您已经获得了受保护的setter。