C# 7.0 で導入された「out 変数宣言(Out variables)」を使用すると、out 引数を持つメソッドを呼び出す際に、その引数部分で直接変数を宣言できるようになりました。
これにより、以前のように変数を事前に宣言するための行を記述する必要がなくなり、コードの記述量を減らしてロジックの流れをスムーズに記述できます。特に TryParse 系メソッドや Dictionary.TryGetValue などを使用する際に非常に有効です。
本記事では、文字列を数値に変換する処理を例に、その具体的な使い方を解説します。
実装例:TryParseでの活用
以下は、ユーザー入力(文字列)を数値(double)に変換するプログラムです。double.TryParse の引数内で out var result と記述することで、変数の宣言と結果の受け取りを同時に行っています。
using System;
namespace OutVariableExample
{
class Program
{
static void Main(string[] args)
{
// 変換対象の文字列
string inputString = "123.456";
Console.WriteLine($"入力文字列: \"{inputString}\"");
// 【ポイント】
// メソッドの引数内で 'out var result' と記述することで
// 変数宣言とメソッド呼び出しを1行で行える。
// 以前は、この行の前に 'double result;' の宣言が必要だった。
if (double.TryParse(inputString, out var result))
{
// 変換成功時、宣言した変数 result はこのブロック内で使用可能
Console.WriteLine($"変換成功: 値は {result} です。");
// 計算にもそのまま使用可能
Console.WriteLine($"2倍の値: {result * 2}");
}
else
{
Console.WriteLine("変換に失敗しました。数値形式ではありません。");
}
// 参考: 別の型(int)での例
// 型推論(var)を使わず、明示的に型を書くことも可能
string intInput = "999";
if (int.TryParse(intInput, out int intValue))
{
Console.WriteLine($"整数変換: {intValue}");
}
}
}
}
out変数宣言の仕様とメリット
1. コードの行数削減と可読性向上
以前の書き方(C# 6.0 以前)では、変数の宣言と使用が分離していました。
// 古い書き方
double result; // 事前の宣言が必要
if (double.TryParse(inputString, out result))
{
// ...
}
out 変数宣言を使うことで、変数が「値を受け取る直前」に宣言されるため、変数の用途が明確になり、意図しない初期値の考慮も不要になります。
2. 変数のスコープ
if 文の条件式内で宣言された out 変数のスコープは、その if ブロックの中だけではありません。その if 文を含むブロック(この場合は Main メソッド全体) にまで及びます。そのため、以下のように if ブロックの外で変数を使用することも可能です。
if (double.TryParse("3.14", out var value))
{
// 変換成功時の処理
}
// ここでも value は参照可能(ただし未初期化の可能性があるため注意が必要)
// Console.WriteLine(value);
まとめ
out 変数宣言は、小さな機能ですが、日常的によく使う TryParse パターンや辞書の検索処理(TryGetValue)を劇的にスッキリさせることができます。
- 構文:
Method(out var variableName)またはMethod(out Type variableName) - 効果: 事前の変数宣言が不要になる。
- 用途: 結果を受け取るための変数を、その場で定義したい場合。
冗長な記述を避け、ロジックの本質に集中するために積極的に活用してください。
