R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

複数の戻り値

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 };
  }
}


のように使いまわす・・・

うーん、なんだかなー
基本的に、複数の値を取得する場合は、それなりの設計思想に基づいて受け取り用オブジェクトを作ることが多いってことで、あまり使う場面がなさそうかな。

投稿日時 : 2008年2月25日 10:05

Feedback

# re: 複数の戻り値 2008/02/25 11:33 siokoshou

>Results
それなんてタプル?
タプルを入れることは考えてるようですね。

# 複数の戻り値祭り便乗 2008/02/25 20:15 Scripting Weblog

複数の戻り値祭り便乗

# re: 複数の戻り値 2008/02/26 0:29 NyaRuRu

(劣化) Tuple 作るなら最低でも値型ですかねぇ.
うちの Achiral にも入ってますのでよろしければどうぞ.
http://d.hatena.ne.jp/NyaRuRu/20080115/p1

# re: 複数の戻り値 2008/02/27 14:52 R・田中一郎

siokoshou さん

>それなんてタプル?

さて、なんてタプルなんでしょう?

-------------------------------------
NyaRuRu さん

>うちの Achiral にも入ってますのでよろしければどうぞ.

ありがとうございます。
参考にさせていただきます。

# re: KeyValuePare<> が意外に使える件 2009/02/06 16:02 R.Tanaka.Ichiro's Blog

re: KeyValuePare<> が意外に使える件

# re: KeyValuePare<> が意外に使える件 2009/02/07 13:20 R.Tanaka.Ichiro's Blog

re: KeyValuePare<> が意外に使える件

# hello 2009/06/21 12:22 Miribourassa

hi

# replica bracciali cartier love 2018/04/25 20:54 kjyebzknkjefstibvyatifzk@hotmal.com

"Talking to reporters after his arrival in London for a medical check-up, he described the air strike in the Dalbandin area of Balochistan as a violation of Pakistan’s sovereignty." Mr PM have you told this to US foreign secretary when he called you ? or just a filled-in statement while enjoying UK trip on public money.
replica bracciali cartier love http://www.toplevejewelry.com.ru/it/

タイトル  
名前  
Url
コメント