プロが教えるわが家の防犯対策術!

プログラミング初心者で、ただいまC#の勉強中です。
bool型(trueまたはfalse)とstring型(関数内で取得した文字列)の値を
配列で関数の戻り値として返したいのですが、どうすれば良いのかわかりません。
true/falseもstringとして呼び出し側で判別するしか方法はないのでしょうか。
アドバイスをお願いいたします。

A 回答 (6件)

できなくはありません。

bool型をToString()などで文字列に変換すれば全て文字列の配列として返すことはできますが、プログラムの作りとしては良くないプログラムの典型になってしまいます。
複数の値を返したい場合は、他の人が書いているように専用のクラスを作成して、それを使って返すようにする方法が良いと思います。(場合によっては、メソッドの粒度や役割が適切かどうか見直しも必要です。1つのメソッドで複数の処理を行わせようとすると、複雑なコードになりがちです)


専用のクラスを使う方法であれば、boolとstring型を格納するResultItemというクラスを作成し、
public class ResultItem{
 public bool IsSuccess{get;set;}
 public string Message{get;set;}
}

これを、メソッドの中で返すようにします。
public ResultItem YourMethod(){
 ResultItem item = new ResultItem();
 // 処理
 item.IsSuccess = true;
 item.Message = "関数内で取得した文字列など";
 return item;
}
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
bool型をToString()、まさしく最初はこのやり方で切り抜けようと思っていました。
皆さんのを参考にしていきます。
今回は最初に回答してくださった方をベストアンサーとさせていただきます。

お礼日時:2014/11/01 13:03

> もし返したい bool 型が関数処理の成否を表すもので、関数を使う側がその戻り値を


> 必ず確認しないとまずい場合は、関数の戻り値を string のみにして失敗時に例外を
> 投げるようにしたほうがいいです。

あるいはこんな:

using System;

public class Program {

static bool fun(int n, out string result) {
result = "???";
if ( n == 0 ) return false;
if ( n > 0 )
result = "正";
else
result = "負";
return true;
}

public static void Main() {
bool nonzero;
string result;
nonzero = fun(0,out result);
if ( nonzero ) Console.WriteLine(result);
nonzero = fun(1,out result);
if ( nonzero ) Console.WriteLine(result);
nonzero = fun(-1,out result);
if ( nonzero ) Console.WriteLine(result);
}

}
    • good
    • 0

(episteme 氏の回答を見て)


……いかん、pair だけしか単語が思いつかなかった……

という事は置いといて、ふと気になったことをアドバイス。
もし返したい bool 型が関数処理の成否を表すもので、関数を使う側がその戻り値を必ず確認しないとまずい場合は、関数の戻り値を string のみにして失敗時に例外を投げるようにしたほうがいいです。さらにもし string がエラー内容を表すものなら戻り値なしにしてその string 込みで例外を投げるように。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます
例外を投げる方法もあるのですね。
参考にさせていただきます。

お礼日時:2014/11/01 13:06

object型の配列として返せば可能だと思いますよ




object[] myFunc(int nTest)
{
  // 戻り用の変数の準備
  object[] objRet = new object[2];

  // 偶数ならtrue 奇数ならfalse
  objRet[0] = (nTest % 2) == 0;

  // 10を超えていれば『over ten 10以下ならば『under ten』の文字列
  objRet[1] = (nTest>10) ? "over ten" : "under ten";

  return objRet;
}


呼び出し元では

object[] oResult;
oResult = myFunc(11);

// oResult[0]:false
// oResult[1]:over ten

といった具合です
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
object型の配列を返す方法があるのですね。
参考にさせていただきます!

お礼日時:2014/11/01 13:04

System.Tupleを返してはいかがかと。



using System;

public class Program {

static Tuple<bool,string> fun(int n) {
if ( n %2 == 0 )
return Tuple.Create(true,"偶数");
else
return Tuple.Create(false,"奇数");
}

public static void Main() {
Tuple<bool,string> result;
result = fun(1);
Console.WriteLine("{0}:{1}", result.Item1, result.Item2);
result = fun(2);
Console.WriteLine("{0}:{1}", result.Item1, result.Item2);
}

}
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
初心者なもので、System.Tupleというのを知りませんでした。
調べてみます。

お礼日時:2014/11/01 13:03

bool 型と string 型をプロパティに持つクラスを新たに作って、問題の関数で配列ではなくそのインスタンスを返すのではだめなんでしょうか。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!