新しい Windows フォーム アプリケーションを作成すると、次の行を含む Program.cs ファイルが生成されます。
Application.Run(new Form1());
私の質問は、適切なフォームが次のようなものであるため、 Form1 がどのようにインスタンス化されるかです:
Form1 myForm = new Form1();
Form1 myForm
部品が欠落しているように見えるので、どのように機能しますか。
これが C# 言語のしくみです。
そのForm1 myForm
部分は、クラスのインスタンスを参照するために使用できる変数を作成するだけです。
部分は、new Form1();
インスタンスを作成するビットです。そして、Application.Run()
関数が気にするのはインスタンスです。
通常、インスタンスを参照せずにインスタンスを作成しても意味がありません。使用できないからです。ただし、いくつかの例外があります。この場合、インスタンスはApplication.Run()
メソッドのパラメーターに割り当てられます。(技術的にはそれへの参照があります)
例えば:
public void Run(Form form)
{
//can use form parameter here
}
//inside some other function
Run(new Form1());
これは次のようなものです:
Form form = new Form1();
その後Run()
、メソッドは必要に応じてそのインスタンスを使用できます。
参照を保持する必要がないもう 1 つの例は、次のような 1 回限りのメソッド呼び出しです。
new Form1().DoSomething();
//here we no longer have access to the instance
しかし、それはめったに適切ではないので、私はそのようなものから遠ざかる傾向があります
オブジェクトのインスタンス化の左側は、インスタンスを保持する変数を宣言するだけです。あなたが言及した場合、オブジェクトを変数にキャプチャする必要はありません-新しく作成された参照はに直接渡されApplication.Run
ます。
Application.Run()
の宣言はおそらく次のようになると考えてください。
public void Run(Form formParameter)
{
this._form = formParameter;
//lots of other stuff
}
ご覧のとおり、 の値が のnew Form1()
に割り当てられRun
ますformParameter
。あなたの直感は部分的に正しいですが、誤解を招きます。オブジェクトを変数に代入せずにオブジェクトをインスタンス化/構築すると便利な状況が数多くあります。オブジェクトを構築し、そのメソッドの 1 つを 1 行で呼び出すことを検討してくださいnew Object().Method()
。