这两个属性实现之间的差异?

时间:2012-05-08 06:07:39

标签: c# static

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

protected static SymTab _symTab;

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

而这不是:

public static SymTab symTab {get; protected set;}

3 个答案:

答案 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。