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. out パラメーターを使用するには、メソッド定義と呼び出し元のメソッドの両方で out キーワードを明示的に使用する必要があります。To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. 例:For example:

using System;

class OutExample
{
   static void Method(out int i)
   {
      i = 44;
   }
   
   static void Main()
   {
      int value;
      Method(out value);
      Console.WriteLine(value);     // value is now 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.

ref キーワードと out キーワードは実行時の動作が異なりますが、コンパイル時に、メソッド シグネチャの一部とは見なされません。Although the ref and out keywords cause different run-time behavior, they are not considered part of the method signature at compile time. したがって、唯一の違いが、1 つのメソッドは ref 引数を使用し、もう一方のメソッドは out 引数を使用することである場合、メソッドはオーバーロードできません。Therefore, methods cannot be overloaded if the only difference is that one method takes a ref 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) { }
}

ただし、一方のメソッドが ref 引数または out 引数を受け取り、もう一方のメソッドがどちらの引数も使用しない場合は、オーバーロードを実行できます。この例を次に示します。Overloading is legal, however, if one method takes a ref or out argument and the other uses neither, like this:

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

プロパティは変数ではないため、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.

次の種類のメソッドには、ref キーワードと out キーワードを使用することはできません。You can't use the 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.

class OutReturnExample
{
    static void Method(out int i, out string s1, out string s2)
    {
        i = 44;
        s1 = "I've been returned";
        s2 = null;
    }

    static void Main()
    {
        int value;
        string str1, str2;
        Method(out value, out str1, out str2);
        // value is now 44
        // str1 is now "I've been returned"
        // str2 is (still) 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.

using System;

public class Example
{
   public static void Main()
   {
      string value = "1640";

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


C# 7 以降では、out 変数を、別の変数宣言内ではなく、メソッド呼び出しの引数リスト内で宣言できます。Starting with C# 7, 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.

using System;

public class Example
{
   public static void Main()
   {
      string value = "1640";

      if (Int32.TryParse(value, out int number))
         Console.WriteLine($"Converted '{value}' to {number}");
      else
         Console.WriteLine($"Unable to convert '{value}'");   
   }
}
// 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.

using System;

public class Example
{
   public static void Main()
   {
      string value = "1640";

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


C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目See Also

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