Main () およびその他のメソッド (C# と Java の比較)
更新 : 2007 年 11 月
ここでは、各メソッドと、メソッド パラメータが参照や値によってどのように引き渡されるかについて説明します。
Main () メソッド
C# アプリケーションでは、常に 1 つの Main メソッドを使用して、プログラムの実行を開始する位置を指定する必要があります。Java では、小文字で始まる main を使用しますが、C# の Main は大文字で始まります。
Main は、次のように int または void のみを返すことができ、コマンド ライン パラメータを表すオプションの文字列配列引数があります。
static int Main(string[] args)
{
//...
return 0;
}
引き渡されたコマンド ライン引数を格納する文字列配列パラメータは Java の場合と同様に機能します。そのため、args[0] が最初のコマンド ライン パラメータを指定し、args[1] が 2 番目のパラメータを指定します。args 配列は、C++ とは違って、EXE ファイルの名前を格納しません。
その他のメソッド
パラメータをメソッドに渡す場合、パラメータは値または参照によって引き渡すことができます。値パラメータは、メソッドで使用する任意の変数の値をただ取得するだけです。そのため、呼び出し元のコード内の変数値は、メソッド内のパラメータに対して実行される処理の影響を受けません。
参照パラメータは、呼び出し元のコードで宣言された変数を指すため、参照による引き渡しの場合、その変数の内容がメソッドによって変更されます。
参照による引き渡し
Java でも C# でも、オブジェクトを参照するメソッド パラメータは常に参照によって引き渡され、プリミティブ データ型パラメータ (C# では値型) は値によって引き渡されます。
C# で参照により値型を引き渡すには、ref と out のいずれかのキーワードを指定する必要があります。これら 2 つのキーワードは、パラメータの初期化の仕方が違います。ref パラメータは、使用する前に初期化する必要がありますが、out パラメータは、引き渡す前に明示的に初期化する必要がなく、以前の値がすべて無視されます。
ref キーワード
呼び出されたメソッドで、パラメータとして使用されている変数の値を完全に変更する場合は、このキーワードを値型パラメータに指定します。これにより、呼び出しで使用される変数の値は引き渡されず、変数自体への参照が引き渡されます。この場合、メソッドは参照を処理するため、メソッドの実行時にパラメータに対して行われた変更は、メソッドへのパラメータとして使用された元の変数に反映され、持続されます。
この一例を、Add メソッドを使用して次のコードに示します。2 番目の int パラメータは、ref キーワードにより参照渡しされます。
class TestRef
{
private static void Add(int i, ref int result)
{
result += i;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(10, ref total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
この簡単なコード例の出力を次に示します。ここでは、結果のパラメータに対して行われた変更が、Add メソッドの呼び出しで使用された変数 total に反映されます。
Original value of 'total': 20
Value after calling Add(): 30
このようになるのも、呼び出し元のコード内の total 変数によって占有されている実際のメモリ位置を、結果のパラメータが参照するからです。クラスのプロパティは変数でないので、ref パラメータとして直接使用できません。
ref キーワードは、メソッド宣言だけでなく、メソッドを呼び出すときにもパラメータの前に配置する必要があります。
out キーワード
out キーワードの効果は、ref キーワードと基本的に同じであり、out で宣言されたパラメータに対して行われた変更がメソッドの外部に反映されます。ref との違いは 2 つあり、1 つは out パラメータの初期値がメソッド内で無視されること、もう 1 つは out パラメータはメソッド内に割り当てる必要があることです。この例を次に示します。
class TestOut
{
private static void Add(int i, int j, out int result)
{
// The following line would cause a compile error:
// System.Console.WriteLine("Initial value inside method: {0}", result);
result = i + j;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(33, 77, out total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
この場合、Add メソッドの 3 番目のパラメータは out キーワードで宣言され、メソッドの呼び出しでも、そのパラメータに対して out キーワードを使用する必要があります。出力は次のようになります。
Original value of 'total': 20
Value after calling Add(): 110
要約すると、メソッドで既存の変数を変更するときは ref キーワードを使用し、メソッド内で生成された値を返すときは out キーワードを使用します。呼び出し元のコードに対し、メソッドが複数の結果値を生成するときは、通常、メソッドの戻り値との関連で out キーワードを使用します。
参照
概念
Main() とコマンド ライン引数 (C# プログラミング ガイド)