http://blogs.wankuma.com/naka/archive/2008/02/24/124708.aspx
Rubyで気に入ったところ(中の技術日誌ブログ)
複数の戻り値
って Perl でも可能でしたね。
Perl では、スカラ変数というなんでも変数に、いろいろな型を格納できるので、引数も戻り値もスカラ変数の配列を介して処理されるのです。
($MailHandle, $MailAddress) = &GetUserData($UserId, "");
sub GetUserData {
my($Id) = @_;
my($MailHandle) = "";
my($MailAddress) ="";
........ (中略)
return($MailHandle, $MailAddress);
}
C# では、タイプセーフという考え方が先に来るので、上記を素直に C# で実現すると object な配列を介して、後から型を変換するような作業が必要になりそう。
var result = GetUserData(UserId);
var MailHandle = result[0].ToString();
var MailAddress = result[1].ToString();
private object[] GetUserData(int Id) {
var $MailHandle = "";
var $MailAddress = "";
........ (中略)
return new object[] { $MailHandle, $MailAddress};
}
Action や Func みたいにジェネリクスを使ったものを用意すると、もっとスマートになりそう。
public class Results<T> {
public T Value { get; set; }
}
public class Results<T1, T2> {
public T1 Value1 { get; set; }
public T2 Value2 { get; set; }
}
public class Results<T1, T2, T3> {
public T1 Value1 { get; set; }
public T2 Value2 { get; set; }
public T3 Value3 { get; set; }
}
みたいなものを用意して・・・
public static class Program {
static void Main() {
if (!TryParse("aaa").Value1) throw new InvalidCastException();
}
static private Results<bool, int> TryParse(string value) {
var intValue = 0;
var flag = int.TryParse(value, out intValue);
return new Results<bool, int> { Value1 = flag, Value2 = intValue };
}
}
のように使いまわす・・・
うーん、なんだかなー
基本的に、複数の値を取得する場合は、それなりの設計思想に基づいて受け取り用オブジェクトを作ることが多いってことで、あまり使う場面がなさそうかな。