別のクラスで静的変数のゲッターを呼び出そうとしています。これが機能する理由を誰かに教えてもらえますか:
protected static SymTab _symTab;
public SymTab symTab
{
get{return _symTab;}
set{_symTab = value;}
}
これはしません:
public static SymTab symTab {get; protected set;}
最初のバージョンには、静的変数を取得/設定するインスタンスプロパティがあります。
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# ではそもそもこれが許可されていません。
次の 2 つの違いがあります。
最初のケースでは、symTab
プロパティ (規則に従って、代わりに SymTab という名前を付けることを検討してください) はインスタンス プロパティです。2 つ目は静的です。そのMyClass.symTab
ため、2 番目のケースでは機能し、最初のケースでは機能しませんが、逆の場合myInstance.symTab
は機能します。
最初のケースではプロパティの getter と setter の両方が public ですが、2 番目のケースでは getter だけが public であり、setter は保護されています。
最初のソリューションでは、後ろに保護された静的変数を持つパブリック設定があり、2 番目のソリューションでは保護されたセッターを既に取得しています。