プログラムのほぼすべての場所で使用されるmainForm
変数があります。この変数を保持するクラスの名前を入力しなくても、この変数を参照できるようにしたいと思います(つまり、同じ名前空間内のどこにでもこの変数にアクセスするGlobal._mainForm
ために入力できるようにする必要があります)。_mainForm
これを達成するための最良の方法は何ですか?
プログラムのほぼすべての場所で使用されるmainForm
変数があります。この変数を保持するクラスの名前を入力しなくても、この変数を参照できるようにしたいと思います(つまり、同じ名前空間内のどこにでもこの変数にアクセスするGlobal._mainForm
ために入力できるようにする必要があります)。_mainForm
これを達成するための最良の方法は何ですか?
私が心配しているものがグローバルにあるのを見るときはいつでも、あなたのプログラムがどのように設計されているかを再考します。ほとんどの場合、グローバルにアクセス可能なオブジェクトがなくても逃げることができます。グローバルにアクセス可能なオブジェクトを使用する正当な理由がありますが、通常、私はそれらから離れようとします。
提供した小さな情報から、メインウィンドウに直接アクセスする代わりに、イベントを使用してメインウィンドウと通信できる場合があります。
グローバルにアクセス可能なオブジェクトが本当に必要な場合は、次のようにすることができます
注:以下のコードでは、すべてが静的です。逆に、本当に関心のあるクラスのインスタンスへの参照を保持する特別な静的クラスを作成できます。しかし、グローバルを保持することを私が知っている方法はありません。オブジェクトのインスタンスへのすべての名前空間の外側にある参照。
using Bar = ProbablyAReallyBadIdeaToHaveAGlobalAnythingButHeyWhyNot.TestClass;
namespace ProbablyAReallyBadIdeaToHaveAGlobalAnythingButHeyWhyNot
{
public static class TestClass
{
public static int TestFoo { get; set; }
}
}
namespace Foo.SomeOtherNamespace
{
class MyClassThatDoesStuff
{
public void DoStuff()
{
Bar.TestFoo = 123;
}
}
}
C#ではこれを実現できません。
名前空間は、単にクラスの型名の一部です。文字通り、名前空間は他の名前空間とクラスのみを含むと考えることができます。
クラスには、フィールド、関数、イベント、プロパティ、ネストされたクラスなどが含まれる場合がありますが、ネストされた名前空間は含まれません。
したがって、特定のクラスに含まれるシンボルをエイリアスまたは参照するクラス外の名前空間でシンボルを定義する方法はありません。
変数名への参照を解決するとき、_mainForm
追加の修飾を必要としない唯一の場所は、それが定義されているクラスのスコープ内からです。
定義するクラスと同じ_mainForm
(_mainForm
静的インスタンスである)名前空間スコープ内にいる場合は、クラス名で修飾することによってのみアクセスする必要があります。それ以外の場合は、追加の名前空間の修飾、またはusing
ディレクティブを使用したトリックが必要になります。ただし、含まれているクラスの外では、にアクセスするには常に何らかの資格が必要になります_mainForm
。
非常に詳細な情報については、 http: //en.csharp-online.net/ECMA-334:_10.7_Scopesを参照してください。
C#で、名前空間内のすべてのクラスが同じ変数を直接アドレス指定できることを確認できる唯一の方法は、名前空間内の他のすべてのクラスで使用される基本クラスで変数を静的として定義することです。静的変数は、それらが定義されているクラス(またはそれらを継承するクラス)内のローカル変数としてアドレス指定できるため、変数はクラス資格なしで使用できます。
それが良い考えだとは言えませんが、それはあなたが尋ねたものではありません...