out パラメーター修飾子 (C# リファレンス)out parameter modifier (C# Reference)

out キーワードによって、参照により引数が渡されます。The out keyword causes arguments to be passed by reference. これは、ref キーワードと似ていますが、ref では、変数を初期化してから渡す必要があります。It is like the ref keyword, except that ref requires that the variable be initialized before it is passed. in キーワードとも似ていますが、in では、呼び出されたメソッドで引数の値を変更することはできません。It is also like the in keyword, except that in does not allow the called method to modify the argument value. out パラメーターを使用するには、メソッド定義と呼び出し元のメソッドの両方で out キーワードを明示的に使用する必要があります。To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. 例:For example:

int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);     // value is now 44

void OutArgExample(out int number)
{
    number = 44;
}

注意

out キーワードは、ジェネリック型パラメーターと共に使用すると、型パラメーターが共変であることを指定することもできます。The out keyword can also be used with a generic type parameter to specify that the type parameter is covariant. このコンテキストでの out キーワードの使用方法の詳細については、「out (ジェネリック修飾子)」を参照してください。For more information on the use of the out keyword in this context, see out (Generic Modifier).

out の引数として渡される変数は、メソッド呼び出しで渡される前に初期化する必要はありません。Variables passed as out arguments do not have to be initialized before being passed in a method call. ただし、呼び出されたメソッドでは、メソッドから制御が返される前に値を割り当てる必要があります。However, the called method is required to assign a value before the method returns.

inrefoutキーワードは実行時の動作が異なりますが、コンパイル時にメソッド シグネチャの一部とは見なされません。Although the in, ref, and out keywords cause different run-time behavior, they are not considered part of the method signature at compile time. したがって、唯一の違いが、1 つのメソッドは ref または in 引数を受け取り、もう一方のメソッドは out 引数を受け取ることである場合、メソッドはオーバーロードできません。Therefore, methods cannot be overloaded if the only difference is that one method takes a ref or in argument and the other takes an out argument. たとえば、次のコードはコンパイルされません。The following code, for example, will not compile:

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

ただし、一方のメソッドが refin、または out 引数を受け取り、もう一方のメソッドにいずれの修飾子もない場合は、オーバーロードを実行できます。この例を次に示します。Overloading is legal, however, if one method takes a ref, in, or out argument and the other has none of those modifiers, like this:

class OutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) => i = 5;
}

コンパイラは、呼び出しサイトのパラメーター修飾子と、メソッド呼び出しで使用されるパラメーター修飾子を照合して、最適なオーバーロードを選択します。The compiler chooses the best overload by matching the parameter modifiers at the call site to the parameter modifiers used in the method call.

プロパティは変数ではないため、out パラメーターとして渡すことはできません。Properties are not variables and therefore cannot be passed as out parameters.

配列を渡す方法については、「ref と out を使用した配列の引き渡し」を参照してください。For information about passing arrays, see Passing Arrays Using ref and out.

次の種類のメソッドには、inrefout キーワードを使用することはできません。You can't use the in, ref, and out keywords for the following kinds of methods:

  • async 修飾子を使用して定義した Async メソッド。Async methods, which you define by using the async modifier.

  • yield return または yield break ステートメントを含む Iterator メソッド。Iterator methods, which include a yield return or yield break statement.

out 引数の宣言Declaring out arguments

out 引数を含むメソッドを宣言すると、メソッドで複数の値を返す場合に便利です。Declaring a method with out arguments is useful when you want a method to return multiple values. 次の例では out を使用して、1 つのメソッド呼び出しで 3 つの変数を返します。The following example uses out to return three variables with a single method call. 3 番目の引数が null に割り当てられることに注意してください。Note that the third argument is assigned to null. これにより、必要に応じてメソッドが値を返すことができます。This enables methods to return values optionally.

void Method(out int answer, out string message, out string stillNull)
{
    answer = 44;
    message = "I've been returned";
    stillNull = null;
}

int argNumber;
string argMessage, argDefault;
Method(out argNumber, out argMessage, out argDefault);
Console.WriteLine(argNumber);
Console.WriteLine(argMessage);
Console.WriteLine(argDefault == null);

Try パターンには、操作が成功したか失敗したかを示す bool を返す処理と、操作によって生成された値を out 引数で返す処理が含まれます。The Try pattern involves returning a bool to indicate whether an operation succeeded and failed, and returning the value produced by the operation in an out argument. DateTime.TryParse メソッドなど、多くの解析メソッドでこのパターンが使用されます。A number of parsing methods, such as the DateTime.TryParse method, use this pattern.

out 引数を含むメソッドの呼び出しCalling a method with an out argument

C# 6 以前では、変数を別のステートメントで宣言してから out 引数として渡す必要があります。In C# 6 and earlier, you must declare a variable in a separate statement before you pass it as an out argument. 次の例では、number という名前の変数を宣言してから、文字列を数値に変換する Int32.TryParse メソッドに渡しています。The following example declares a variable named number before it is passed to the Int32.TryParse method, which attempts to convert a string to a number.

string numberAsString = "1640";

int number;
if (Int32.TryParse(numberAsString, out number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

C# 7.0 以降では、out 変数を、別の変数宣言内ではなく、メソッド呼び出しの引数リスト内で宣言できます。Starting with C# 7.0, you can declare the out variable in the argument list of the method call, rather than in a separate variable declaration. これにより、よりコンパクトで読みやすいコードが生成されます。また、メソッド呼び出しの前に誤って変数に値を割り当てることもなくなります。This produces more compact, readable code, and also prevents you from inadvertently assigning a value to the variable before the method call. 次の例は前の例と似ていますが、Int32.TryParse メソッドの呼び出しで number 変数を定義している点が異なります。The following example is like the previous example, except that it defines the number variable in the call to the Int32.TryParse method.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out int number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

前の例では、number 変数は int として厳密に型指定されています。In the previous example, the number variable is strongly typed as an int. 次の例のように、暗黙的に型指定されたローカル変数を宣言することもできます。You can also declare an implicitly typed local variable, as the following example does.

string numberAsString = "1640";

if (Int32.TryParse(numberAsString, out var number))
    Console.WriteLine($"Converted '{numberAsString}' to {number}");
else
    Console.WriteLine($"Unable to convert '{numberAsString}'");
// The example displays the following output:
//       Converted '1640' to 1640

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

参照See Also

C# リファレンスC# Reference
C# プログラミング ガイドC# Programming Guide
C# のキーワードC# Keywords
メソッド パラメーターMethod Parameters