- PR -

C# 戻り値の型を動的に変更することは可能ですか?

投稿者投稿内容
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2005-04-30 18:00
お世話になっています、初心者のnewbornです。

前々から気になっていたことを質問させていただきます。

C#でファンクションを書く際には戻り値の型を設定すると思いますが、
その型を変更することはできるのでしょうか?



int myFucntion (int value1){
string errorStr="";

try{
int finalValue= value1*10000;
}catch(Exception e){
errorStr= e.ToString();
}
  
if(errorStr==""){
return finalValue;
}else{
return errorStr;
}

}

あまりよい例ではないかも知れませんが、
エラーがあった場合は、そのエラーの文字列をそうでない場合は
変数 finalValueを返すといった具合にしたいとき、戻り値が
int に定義されているためにエラーになると思うのですが、

皆さん、このような場合はどうされているのですか?

お知恵を拝借できれば幸いです。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-04-30 18:04
できません。
挙げられた例の場合、通常は例外を投げるでしょう。
返値の型をobjectにすれば受け側でどうとでもできますが、それは強型指向の言語であるC#的ではありませんし。
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2005-04-30 18:55
引用:

できません。
挙げられた例の場合、通常は例外を投げるでしょう。
返値の型をobjectにすれば受け側でどうとでもできますが、それは強型指向の言語であるC#的ではありませんし。



HongLiangさん、返信ありがとうございます。
やはり無理ですか。
すごく初歩的なのは分かっているのですが、『通常は例外を投げるでしょう』とは
どういったことなのでしょうか?
@ITのC#初心者入門の例外処理の部分をみてみたのですが、
例外を投げるメリット(そうする意義)?がいまいちわかりません。

どうぞよろしくお願いします
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-30 20:50
例外を投げるようにしてみました。
コード:
    int ret;
    string errMsg;
    try {
        ret = myFunction(value1);
    catch (Exception ex) {
        errMsg = ex.ToString();
    }


int myFucntion (int value1){
    int finalValue= value1 * 10000;
    return finalValue;
}


すっきり!!


> 例外を投げるメリット(そうする意義)?がいまいちわかりません。
 コードをすっきりさせること。
 本当に返したいものと、例外的な状況とを分けること。

 まぁ、座学ではわかりにくいと思います。複数のコードを自分で書いたり、読んだりしているうちにわかるでしょう。
_________________
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-04-30 23:30
http://www.microsoft.com/japan/msdn/columns/csharp/csharp07192001.asp
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-04-30 23:56
「戻り値の型を変更する」というと、別のことを考えてしまう人もいると思うのですが、まあそれはおいといて…

やり方は3つあると思います。もっとありそうな気もしますがとりあえず3つ:
(1) object型でintまたはstringを返して、受け取り側で型を判別する
(2) 例外を投げる
(3) refあるいはoutのパラメータを使う

例外は本当に例外的な状況で投げるべきものであって、その処理中でExceptionが発生することが予定されている(微妙な表現ですが)のであれば、文字列を結果に含める方が妥当である場合もありますし、少なくとも本題のコードから、この場合は通常例外を投げるとは、私には読み取れません。
それに、throwは大きなパフォーマンスダウンにも繋がります。さらに、例外をそのまま投げるというのは、また呼び出し元が限られていて十分に制御出来る場合にしか妥当な解決策になりません(例外をユーザーの目に見えるところまで持って行きたくないから、わざわざ一度catchするわけですよね)。

というわけで、このように戻り値を複数返したい場面では、私は(3)をよく使います。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-05-01 00:25
ここに例外のガイドラインが書かれています。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpgenref/html/cpconerrorraisinghandlingguidelines.asp

基本的に戻り値の型を変えるというのは、アブノーマルすぎますね。。。
そんなメソッド使いづらくないでしょうか?
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-05-01 01:08
引用:

例外をそのまま投げるというのは、また呼び出し元が限られていて十分に制御出来る場合にしか妥当な解決策になりません。


逆じゃないの? 普通は制御できないから例外を投げるんだと思うけど。あなたの言うように、呼び出し元が限られていて十分に制御できる場合であれば、(戻り値を Object形にしたり) エラー状態を戻り値に折り込むことを許容してもいいと思う。戻り値に正常値とエラー値を持たせたり(エラーの場合は -1 を返す仕様の関数とか見たことあるよね)、ひとつの変数に複数の状態を割り当てたりすることをダブルミーニングと呼ぶのだけど、最近の富豪的プログラミングの流れではダブルミーニングな実装は嫌われる傾向にありますね。私もダブルミーニング嫌いです。

引用:

というわけで、このように戻り値を複数返したい場面では、私は(3)をよく使います。


例外を使用するメリットのひとつに「プログラマがエラーが発生したかどうかを明示的に判定する必要がない」ということがあります。これはプログラマが API 仕様に精通していなくてもエラーを見逃すことがないということにもなります。

今回の話では、エラー時に文字列を返したいということだけど、これを エラーのときは -1 を返し例外は投げないという仕様だとしましょう。この場合、プログラマは戻り値が -1 であるかどうかを判定して処理を継続してよいかどうか決めなければなりません。もしプログラマが -1 がエラーをあらわすという仕様を知らなかったら、きっと後続の処理に戻り値 -1 を投入してしまうことでしょう。これは危険ですね。Atsushi.Eno さんの出力パラメータを使う方法も同じ危険性があります。出力パラメータが bool error などになっていれば、プログラマが仕様に気付く可能性は高いと思いますが、安全性では例外に劣ります。

スキルアップ/キャリアアップ(JOB@IT)