2012-07-04 6 views
37

C#でpublic void Main()を作成しようとしましたが、それはスタティックボイドのメインが見つかりませんと言います。
Mainが静的​​であることは正確にはどういう意味ですか?私はコードがpublic static void Main()のためにうまく働くことを知っています。メインはなぜ静的であるべきですか?

しかし、なぜMainstaticである必要がありますか?

+0

javaについても同様の質問がありましたが、回答もここに当てはまると思います。http://stackoverflow.com/questions/146576/why-is-the-java-main-method-static – Tudor

+5

'静的な'は一般的に*何を意味するのか、あるいはこれが特に 'Main'の周りにあるのかを理解していないからです。 –

答えて

46

プログラムにエントリポイントが必要です。静的とは、クラスのオブジェクト/インスタンスをインスタンス化することなく、関数を呼び出すことができることを意味します。ちょっと「鶏と卵」...プログラムの中に入る前にオブジェクトをインスタンス化することはできません。

静的メソッドは、オブジェクトをインスタンス化せずに呼び出すことができます。したがって、main()は、プログラムへのエントリになるためには静的である必要があります。

Davidによれば、関数定義にキーワードstaticを追加するだけで、変更することができます。静的(クラス)メソッドとインスタンスメソッドを調べる価値があり、その違いが時々有用であることがわかっています。

+25

"プログラムの中に入る前にオブジェクトをインスタンス化することはできません。"ランタイムは 'Main'が実行される前に多くのオブジェクトをインスタンス化します。 'Main'を含むクラスに静的コンストラクタを置くことで、自分自身を起動できます。申し訳ありませんが、このスレッドは1年以上経過していますが、これは関連性があると感じています。 –

+7

重要な点は、言語がオブジェクトをインスタンス化しないように定義されていることです。静的関数を呼び出すように定義されています。それは異なって働くことができるが、そうではない。 – usr

14

この動作を定義する規則が存在するため、静的メインメソッドのみがジョブを実行できます。別の理由はありません。

C# language specificationを見てみましょう:実行環境は、アプリケーションのエントリ ポイントと呼ばれている 指定されたメソッドを呼び出したときに

アプリケーションの起動が発生します。このエントリポイント法は、常にMain命名され、そして以下のシグネチャの いずれかを有するもの:

 static void Main() {…} 
    static void Main(string[] args) {…} 
    static int Main() {…} 
    static int Main(string[] args) {…} 

示すように、エントリポイントは、int値を返す 任意することができます。この戻り値は、アプリケーション 終了(10.2)で使用されます。

注:上記は4th editionから引用されており、現在は「履歴」と表示されています。現在の版は別の言葉で表現されています。

それに加えて、Mainという名前を別のものに変更することができます。この場合、プログラムのエントリポイントとして別のメソッドをマークするようにC#コンパイラに指示するコンパイラオプションを追加する必要があります。

+0

なぜ2つの正解の後に間違った答えを投稿するのですか? –

+0

なぜ、それが間違っていると思われるのか説明してください。 –

+0

正解は私と@ DavidMの答えです。仕様書には、あなたがしなければならないことだけが述べられている理由はありません。 –

1

概念的には、特定の静的メソッドを使用してプログラムを実行するのではなく、特定のクラスのデフォルトインスタンスを構築し、その上に特定のメソッドを実行するようにフレームワークが指定できる可能性があります。いずれにしても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コールを有するであろうことを保証するために、本質的に同時に起動他のアプリケーションインスタンスと調整する方法であった場合。しかし、このような調整スキームがないと、フレームワークがアプリケーションオブジェクトを実行する前にそのフレームワークを構築する必要はありません。コストは膨大ではありませんが、潜在的な識別可能な利益がなければ、些細なコストでさえ受け入れることはあまり意味がありません。

3

クラス内のメソッドの2つのタイプがあります。

  1. 非静的メソッド
  2. staticメソッド

// 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. staticメソッド:

静的メソッド(関数)を呼び出すに

、我々はそのメソッドのオブジェクトをインスタンス化または作成する必要はありません。クラスがロードされ、コンパイルされたとき、我々は直接の静的メソッドを呼び出す理由があるので、デフォルトによってstaticキーワードは、そのクラスのメソッドのオブジェクトをインスタンス化または作成し、ので、私たちはnewキーワードを使用することはできません。 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(); 
-4

静的メンバを(むしろオブジェクトレベルより)クラスレベルにスコープされています最初に新しいクラスインスタンスを作成する必要なく呼び出すことができます。主な方法は静的です。なぜなら、プログラムが起動するときに実行することができ、クラスのインスタンスを作成せずに実行するプログラムのエントリポイントであるからです。

つまり、クラスがインスタンス化される前に静的関数が存在するため、staticがメインエントリポイント(Mainメソッド)に適用されます。

+4

ウェブサイトからの情報を貼り付ける場合は、少なくともソースを指定してください。 http://www.codeproject.com/Articles/479467/Main-Method-in-Csharp –

1

アプリケーションの起動時に、クラスのオブジェクトが作成されていないときは、Mainメソッドを呼び出してプログラムの実行を開始する必要があります。メインは、アプリのエントリポイントと呼ばれることもあります。 Mainをstaticと宣言すると、実行環境はクラスのインスタンスを作成せずにMainを呼び出すことができます。この方法の主は通常、ヘッダと宣言されています。

static void Main(){..} 

もヘッダで宣言することができます。

static void Main(string[] args){..} 

あなたは - これは便利です(代わりにボイドの)戻り値の型intでメインを宣言することができますアプリが別のアプリによって実行され、成功または失敗の表示をその他のアプリに返す必要がある場合。

関連する問題