out (C# リファレンス)
out コンテキスト キーワードは、パラメーター修飾子として使用するか、またはインターフェイスとデリゲートのジェネリック型パラメーターの宣言で使用するという 2 つのコンテキスト (それぞれは詳細な情報へのリンク) で使用できます。 このトピックでは、パラメーター修飾子について説明しますが、ジェネリック型パラメーターの宣言の詳細については、こちらのトピックを参照してください。
out キーワードによって、参照により引数が渡されます。 これは、ref キーワードと同様ですが、ref は渡す前に、変数を初期化する必要があります。 out パラメーターを使用するには、メソッド定義と呼び出し元のメソッドの両方で out キーワードを明示的に使用する必要があります。 次に例を示します。
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
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) { }
}
ただし、次のように 1 つのメソッドが ref 引数または out 引数を使用し、他のメソッドがいずれも使用しない場合はオーバーロードを実行できます。
class OutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(out int i) { i = 5; }
}
プロパティは変数ではないため、out パラメーターとして渡すことはできません。
配列の引き渡しについては、「ref と out を使用した配列の引き渡し (C# プログラミング ガイド)」を参照してください。
次の種類のメソッドには、ref キーワードと out キーワードを使用することはできません。
async 修飾子を使用して定義した Async メソッド
yield return または yield break ステートメントを含む Iterator メソッド
使用例
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;
}
}