public void Main()
C#で作成しようとしました。静的ボイドメインが見つかりませんでした。
静的であるとはどういう意味Main
ですか?私はコードがのためにうまくいくことを知っていますpublic static void Main()
。
しかし、なぜそうしMain
なければならないのstatic
ですか?
public void Main()
C#で作成しようとしました。静的ボイドメインが見つかりませんでした。
静的であるとはどういう意味Main
ですか?私はコードがのためにうまくいくことを知っていますpublic static void Main()
。
しかし、なぜそうしMain
なければならないのstatic
ですか?
プログラムへのエントリポイントが必要です。静的とは、クラスのオブジェクト/インスタンスをインスタンス化せずに関数を呼び出すことができることを意味します。それは少し「鶏が先か卵が先か」です...プログラムの中に入る前にオブジェクトをインスタンス化することはできません。
静的メソッドは、オブジェクトをインスタンス化せずに呼び出すことができます。したがってmain()
、プログラムへのエントリとして使用できるようにするには、静的である必要があります。
Davidが言うようstatic
に、関数定義にキーワードを追加するだけで変更できます。静的(クラス)メソッドとインスタンスメソッドを比較することは価値があり、違いを知ることは時々役立つことがあります。
この動作を定義する規則があるため、静的mainメソッドのみがジョブを実行できます。別の理由はありません。
C#言語仕様を見てください:
アプリケーションの起動は、実行環境がアプリケーションのエントリポイントと呼ばれる指定されたメソッドを呼び出すときに発生します。このエントリポイントメソッドには常に名前が付けられ
Main
、次のいずれかのシグネチャが必要です。static void Main() {…} static void Main(string[] args) {…} static int Main() {…} static int Main(string[] args) {…}
示されているように、エントリポイントはオプションで
int
値を返すことができます。この戻り値は、アプリケーションの終了(§10.2)で使用されます。
注:上記は第4版から引用されており、現在は「歴史的」とラベル付けされています。現在の版は別の言い方をしています。
それに加えて、名前を別の名前Main
に変更することができます。この場合、コンパイラオプションを追加して、C#コンパイラにプログラムのエントリポイントとして別のメソッドをマークするように指示する必要があります。
クラス内のメソッドには2つのタイプがあります。
// Example of static and non-static methods and how to call
namespace TestStaticVoidMain
{
class Program
{
Static Void Main(string[] args)
{
// Instantiate or create object of the non-static method:
Exam ob = new Exam();
// Call the instance:
ob.Test1();
// Directly the call the static method by its class:
Exam.Test2();
Console.ReadKey();
}
}
class Exam
{
public void Test1()
{
Console.WriteLine("This is a non-static method");
}
public static void Test2()
{
Console.WriteLine("This is a static method");
}
}
}
1.静的メソッド:
静的メソッド(関数)を呼び出すために、そのメソッドのオブジェクトをインスタンス化または作成する必要はありません。new
クラスがロードおよびコンパイルされるときに、static
キーワードはデフォルトでそのクラスメソッドのオブジェクトをインスタンス化または作成するため、キーワードを使用できません。そのため、静的メソッドを直接呼び出します。
を参照してstatic void Main(string[] args)
、すでに説明しstatic
ました。残りはvoid Main(string[] args)
です。void
何も返さないデータ型です。Main()
C#プログラムを実行するための標準のエントリポイントです。オプションの引数string[] args
は、プログラムが実行されたオプションの「コマンドライン」パラメーターを受け取ります。
2.非静的sethod:
非静的メソッドを呼び出すには、クラスメソッドのオブジェクトをインスタンス化または作成して、キーワードを使用してクラスのメソッド(関数)を呼び出す必要がありますnew
。
に名前が付けられたクラスに、という名前Test
の非静的メソッドshow()
がある場合、インスタンスを呼び出す方法は次のとおりです。
// to call non-static method
Test ob=new Test();
ob.show();
概念的には、フレームワークは、特定の静的メソッドを使用してプログラムを実行するのではなく、特定のクラスのデフォルトインスタンスを構築し、その上で特定のメソッドを実行するように指定することができます。静的メソッドをコンパイラで初期化されたシングルトンインスタンスのインスタンスメンバーにすることで静的メソッドを実装するフレームワークがある場合、フレームワークはどのような場合でもmain関数を呼び出す前に新しいオブジェクトインスタンスを生成する必要があるため、このようなアプローチは完全に合理的です。 。
ただし、静的メソッドの呼び出しが、新しいオブジェクトインスタンスを作成してそのメソッドを呼び出すよりも「簡単」である場合、フレームワークがより高価な一連のアクションを使用することを要求することには、それほどメリットはありません。後者のアプローチを使用したいコードは、完全に自由に使用できます。
public static void Main( [[params]] )
{
var mainObject = new MainObject();
mainObject.Main( [[params]] );
}
システムに次のような独自の静的メソッドを含めることには、いくつかの潜在的な利点があります。
public static void SysMain( [[params]] )
{
using (Application app = new UserApp( [[params]] )) // UserApp derives from Application
{
app.Start(); // Virtual method
app.AllowNext(); // Base method--see text
app.Run(); // Abstract method
}
}
ここapp.AllowNext()
で、本質的に同時に起動された他のアプリケーションインスタンスと調整して、バックグラウンドでアプリケーションを起動しようと繰り返し試行すると、Start
呼び出しが厳密に順番に処理されるようにする方法がありました。ただし、このような調整スキームがない場合、フレームワークが実行する前にアプリケーションオブジェクトを構築することを要求することにはあまりメリットがありません。コストはそれほど大きくはありませんが、識別可能な潜在的なメリットがなければ、些細なコストでさえ受け入れる意味はありません。
アプリの起動時に、クラスのオブジェクトが作成されていない場合、プログラムの実行を開始するにはMainメソッドを呼び出す必要があります。Mainは、アプリのエントリポイントと呼ばれることもあります。Mainを静的として宣言すると、実行環境はクラスのインスタンスを作成せずにMainを呼び出すことができます。メソッドMainは通常、ヘッダーで宣言されます。
static void Main(){..}
ただし、ヘッダーを使用して宣言することもできます。
static void Main(string[] args){..}
Mainは(voidではなく)return type intで宣言できます。これは、アプリが別のアプリによって実行され、成功または失敗の兆候を他のアプリに返す必要がある場合に役立ちます。
メインは静的である必要があり、最初にロードされてプログラムへのエントリポイントになるため、メインが静的であることが重要です。