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

out キーワードによって、参照により引数が渡されます。 これは、ref キーワードと似ていますが、ref では、変数を初期化してから渡す必要があります。 out パラメーターを使用するには、メソッド定義と呼び出し元のメソッドの両方で out キーワードを明示的に使用する必要があります。 例:

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 キーワードは、ジェネリック型パラメーターと共に使用すると、型パラメーターが共変であることを指定することもできます。 このコンテキストでの out キーワードの使用方法の詳細については、「out (ジェネリック修飾子)」を参照してください。

out の引数として渡される変数は、メソッド呼び出しで渡される前に初期化する必要はありません。 ただし、呼び出されたメソッドでは、メソッドから制御が返される前に値を割り当てる必要があります。

ref キーワードと out キーワードは実行時の動作が異なりますが、コンパイル時に、メソッド シグネチャの一部とは見なされません。 したがって、唯一の違いが、1 つのメソッドは ref 引数を使用し、もう一方のメソッドは out 引数を使用することである場合、メソッドはオーバーロードできません。 たとえば、次のコードはコンパイルされません。

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 引数を受け取り、もう一方のメソッドがどちらの引数も使用しない場合は、オーバーロードを実行できます。この例を次に示します。

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

プロパティは変数ではないため、out パラメーターとして渡すことはできません。

配列を渡す方法については、「ref と out を使用した配列の引き渡し」を参照してください。

次の種類のメソッドには、ref キーワードと out キーワードを使用することはできません。

  • async 修飾子を使用して定義した Async メソッド。

  • yield return または yield break ステートメントを含む Iterator メソッド。

out 引数の宣言

out 引数を含むメソッドを宣言すると、メソッドで複数の値を返す場合に便利です。 次の例では out を使用して、1 つのメソッド呼び出しで 3 つの変数を返します。 3 番目の引数が null に割り当てられることに注意してください。 これにより、必要に応じてメソッドが値を返すことができます。

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 引数で返す処理が含まれます。 @System.DateTime.TryParse(System.String,@System.DateTime) メソッドなど、多くの解析メソッドでこのパターンが使用されます。

out 引数を含むメソッドの呼び出し

C# 6 以前では、変数を別のステートメントで宣言してから out 引数として渡す必要があります。 次の例では、number という名前の変数を宣言してから、文字列を数値に変換する [Int32.TryParse](xref:System.Int32.TryParse(System.String,@System.Int32) メソッドに渡しています。

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 変数を、別の変数宣言内ではなく、メソッド呼び出しの引数リスト内で宣言できます。 これにより、よりコンパクトで読みやすいコードが生成されます。また、メソッド呼び出しの前に誤って変数に値を割り当てることもなくなります。 次の例は前の例と似ていますが、[Int32.TryParse](xref:System.Int32.TryParse(System.String,@System.Int32) メソッドの呼び出しで number 変数を定義している点が異なります。

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 として厳密に型指定されています。 次の例のように、暗黙的に型指定されたローカル変数を宣言することもできます。

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# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目

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