0

別のクラスで静的変数のゲッターを呼び出そうとしています。これが機能する理由を誰かに教えてもらえますか:

protected static SymTab _symTab;

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

これはしません:

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

3 に答える 3

4

最初のバージョンには、静的変数を取得/設定するインスタンスプロパティがあります。

2 番目のバージョンには、静的変数を取得/設定するstaticプロパティがあります。(セッターも保護されていますが、それは差し迫った問題ではないようです。)

最初の形式は強くお勧めしません。インスタンスのプロパティは、そのインスタンスに関する何かを反映する必要があります。あるインスタンスでプロパティを設定しても、別のインスタンスのプロパティ値が変更されるとは思わないでしょう。

2 番目の形式では、次のように使用できます。

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

次の 2 つの違いがあります。

  • 最初のケースでは、symTabプロパティ (規則に従って、代わりに SymTab という名前を付けることを検討してください) はインスタンス プロパティです。2 つ目は静的です。そのMyClass.symTabため、2 番目のケースでは機能し、最初のケースでは機能しませんが、逆の場合myInstance.symTabは機能します。

  • 最初のケースではプロパティの getter と setter の両方が public ですが、2 番目のケースでは getter だけが public であり、setter は保護されています。

于 2012-05-08T06:16:13.850 に答える
0

最初のソリューションでは、後ろに保護された静的変数を持つパブリック設定があり、2 番目のソリューションでは保護されたセッターを既に取得しています。

于 2012-05-08T06:10:49.627 に答える