C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 71 を表示中)
■41366 / )  Re[4]: C#における値渡しと参照渡しのコーディングについて
□投稿者/ simano (12回)-(2009/09/18(Fri) 14:49:15)
No41356 (渋木宏明(ひどり) さん) に返信
>> data.MyClass = MyClass; // Class(プロパティ)を設定。値は「参照渡し」される。
>> data.MyStruct = MyStruct; // Struct(プロパティ)を設定。値は「値渡し」される。
>
> 微妙に違います。
> 弁士さんの解説を読み直してみてください。

確かに、微妙に違ってますね;すみません。
ですが、「参照渡しを行いたい需要もある」、
という点では変わらないのではないでしょうか。
コーディングの癖を直せばいいといえばそれまでなのですが。

>>■ネットワーク通信などで、エラー検出とデータの読み込みを同時に行いたい場合
>>C#には検査例外がないという理由から、
>>エラー結果を検出する手段として、メソッドの戻り値を使うことが一般的なようです。
>
> なことないです。
> 標準クラスライブラリに含まれているクラス/コンポーネントの類は、通信エラーを例外で表現しています。
>
>> public bool ReadSQLInfo(MySQLInfo info)
>
> こんな書き方(成否を bool で返す)しません。
> ReadSQLInfo は、MySQLInfo のインスタンスを返すように設計します。
>

勉強不足ですみません。
ネットワーク通信の結果を例外のみに任せるべきということですね。
ただ、それは、検査例外がない言語では、扱いにくいのでは?と考えた結果が上記の処理でした。

例えば、サーバと通信して、「実データ」と「結果値」を受ける仕様になっているとします。
「結果値」が「クライアントから受けた値が不正です」だった場合の処理を書いてみました。
----------
public MyData GetFromServer(int arg)
{
// 略
try {
// サーバとのソケット通信。引数に"arg"を渡す。
}
catch (Exception e)
{
throw;
}

MyData data = new MyData();
data = Server_DataBytes_Value; // サーバの返した実データを渡す。

int val = Server_Return_Value; // サーバの返した結果値を渡す。
if (val == ILLEGAL_ARG) // 「クライアントから受けた値が不正です」などのエラー値。
{
throw new MyServerException(val); // 自作の例外クラス
}
}
----------

上記の場合、通信を行っているクラスがアプリケーションの直下にあればいいですが、
dllだったら例外のパターンを把握するのも一苦労だと思います。
後でいつのまにか例外の種類が変わってたらcatchできません。

そこで、「結果値」は、戻り値として返す処理が適切なのかなと思いました。

論点がずれてしまいました…;
例外処理については、自分の中でまだ未消化でして、思慮が浅いのだと思います。
上記の考え違いがありましたら、ご指摘願えないでしょうか。

>Java や C++ を、C 言語的な目線で習得したような印象を受けます。

いえ、C言語はほとんどやってません。
それだけに、Javaに似てるのかと思ったら、内実はC言語の流れなのか…?等々悩んでるうちに、
だんだん変な方向に突き進んでいるのかもしれません;

返信 編集キー/


管理者用

- Child Tree -