0

我正在尝试在另一个类中调用静态变量的 getter。有人可以告诉我为什么会这样:

protected static SymTab _symTab;

public SymTab symTab
{
    get{return _symTab;}
    set{_symTab = value;}
}

这不会:

public static SymTab symTab {get; protected set;}
4

3 回答 3

4

第一个版本有一个实例属性,它获取/设置一个静态变量。

第二个版本有一个静态属性,它获取/设置一个静态变量。(二传手也受到保护,但这似乎不是您的直接问题。)

我强烈反对第一种形式——实例属性应该反映该实例的某些内容;您不会期望在一个实例上设置一个属性来更改另一个实例的属性值。

使用第二种形式,您可以使用:

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# 一开始就不允许这样做。

于 2012-05-08T06:14:26.847 回答
1

有两个区别:

  • 在第一种情况下,symTab属性(考虑将其命名为 SymTab,以遵循约定)作为实例属性。第二,它是静态的。所以MyClass.symTab将在第二种情况下工作,而不是在第一种情况下,myInstance.symTab反之亦然。

  • 在第一种情况下,属性的 getter 和 setter 都是公共的,而在第二种情况下,只有 getter 是公开的,并且 setter 是受保护的。

于 2012-05-08T06:16:13.850 回答
0

使用第一个解决方案,您有一个公共设置,后面有一个受保护的静态变量,而使用第二个解决方案,您已经获得了一个受保护的 setter。

于 2012-05-08T06:10:49.627 回答