- ベストアンサー
C#で配列の戻り値について
プログラミング初心者で、ただいまC#の勉強中です。 bool型(trueまたはfalse)とstring型(関数内で取得した文字列)の値を 配列で関数の戻り値として返したいのですが、どうすれば良いのかわかりません。 true/falseもstringとして呼び出し側で判別するしか方法はないのでしょうか。 アドバイスをお願いいたします。
- みんなの回答 (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; }
その他の回答 (5)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> もし返したい 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); } }
- hitomura
- ベストアンサー率48% (325/664)
(episteme 氏の回答を見て) ……いかん、pair だけしか単語が思いつかなかった…… という事は置いといて、ふと気になったことをアドバイス。 もし返したい bool 型が関数処理の成否を表すもので、関数を使う側がその戻り値を必ず確認しないとまずい場合は、関数の戻り値を string のみにして失敗時に例外を投げるようにしたほうがいいです。さらにもし string がエラー内容を表すものなら戻り値なしにしてその string 込みで例外を投げるように。
お礼
アドバイスありがとうございます 例外を投げる方法もあるのですね。 参考にさせていただきます。
- redfox63
- ベストアンサー率71% (1325/1856)
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 といった具合です
お礼
アドバイスありがとうございます。 object型の配列を返す方法があるのですね。 参考にさせていただきます!
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
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); } }
お礼
アドバイスありがとうございます。 初心者なもので、System.Tupleというのを知りませんでした。 調べてみます。
- hitomura
- ベストアンサー率48% (325/664)
bool 型と string 型をプロパティに持つクラスを新たに作って、問題の関数で配列ではなくそのインスタンスを返すのではだめなんでしょうか。
お礼
アドバイスありがとうございます。 bool型をToString()、まさしく最初はこのやり方で切り抜けようと思っていました。 皆さんのを参考にしていきます。 今回は最初に回答してくださった方をベストアンサーとさせていただきます。