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

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

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

Re[1]: メソッドの戻り値と引数について


(過去ログ 97 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■57615 / inTopicNo.1)  メソッドの戻り値と引数について
  
□投稿者/ ちゃん (2回)-(2011/03/07(Mon) 10:56:00)

分類:[C#] 

少し疑問に思ったのですが、コレクションを引数にするか、戻り値にするか、
皆さんはどのように使い分けているのでしょうか?

例えばファイル内容を読み込み、結果をコレクションに格納するようなメソッドで、
戻り値をコレクションにするか、引数をコレクションにするかで悩んでいます。

皆さんのご意見をよろしくお願い致します。
引用返信 編集キー/
■57617 / inTopicNo.2)  Re[1]: メソッドの戻り値と引数について
□投稿者/ 渋木宏明 (61回)-(2011/03/07(Mon) 11:12:13)
渋木宏明 さんの Web サイト
>少し疑問に思ったのですが、コレクションを引数にするか、戻り値にするか、
>皆さんはどのように使い分けているのでしょうか?

LINQ 登場以降は、単純に IEnumerable<T> を返す場合が多いです>じぶん

引用返信 編集キー/
■57618 / inTopicNo.3)  Re[1]: メソッドの戻り値と引数について
□投稿者/ マサヤ (273回)-(2011/03/07(Mon) 11:14:55)
> 戻り値をコレクションにするか、引数をコレクションにするかで悩んでいます。
returnで値をとるかout(ref)などで値をとるか、のお話ですよね。
参照渡しについて調べるとヒントになるかもしれません。
参考までにリンクを貼っておきます。
http://www.aerith.net/design/argument-j.html
引用返信 編集キー/
■57624 / inTopicNo.4)  Re[2]: メソッドの戻り値と引数について
□投稿者/ shu (497回)-(2011/03/07(Mon) 12:06:11)
メソッド内でインスタンス作成する場合は戻り値にしてます。

引用返信 編集キー/
■57628 / inTopicNo.5)  Re[3]: メソッドの戻り値と引数について
□投稿者/ じゃんぬねっと (47回)-(2011/03/07(Mon) 12:39:19)
じゃんぬねっと さんの Web サイト
インスタンス自体の型が必要だとか、Append 的な使い方をしない限り return です。
out/ref 関係なしで、わかりやすい例が DataAdapter.Fill メソッドにおける DataTable 引数。
引用返信 編集キー/
■57631 / inTopicNo.6)  Re[4]: メソッドの戻り値と引数について
□投稿者/ ちゃん (3回)-(2011/03/07(Mon) 13:12:37)
皆さんありがとうございます。

じゃんぬねっとさんの解答で
> インスタンス自体の型が必要だとか、Append 的な使い方をしない限り return です。
これは例えばListでメソッド内でアイテムの追加をするような場合は引数として受け取るということでしょうか?

> out/ref 関係なしで、わかりやすい例が DataAdapter.Fill メソッドにおける DataTable 引数。
これはDataTableを作成するから引数として受け取るということでしょうか?

間違っていたらすみません。

引用返信 編集キー/
■57632 / inTopicNo.7)  Re[5]: メソッドの戻り値と引数について
□投稿者/ shu (499回)-(2011/03/07(Mon) 13:17:30)
No57631 (ちゃん さん) に返信

>>out/ref 関係なしで、わかりやすい例が DataAdapter.Fill メソッドにおける DataTable 引数。
> これはDataTableを作成するから引数として受け取るということでしょうか?
DataAdapter.Fill のDataTableの引数はインスタンス化したものを渡さないと駄目です。
引用返信 編集キー/
■57638 / inTopicNo.8)  Re[5]: メソッドの戻り値と引数について
□投稿者/ じゃんぬねっと (48回)-(2011/03/07(Mon) 14:55:55)
じゃんぬねっと さんの Web サイト
No57631 (ちゃん さん) に返信
> これは例えばListでメソッド内でアイテムの追加をするような場合は引数として受け取るということでしょうか?

戻りをどうするか以前に、そうしないと "何に" 追加するのかわからないですよね?
(プロパティにしたりすることもできますが、今はメソッド単独だった場合の話なので除外)

> これはDataTableを作成するから引数として受け取るということでしょうか?
> 間違っていたらすみません。

既定の FCL の Fill メソッドではそういうオーバーロードしかないです。
また前述したことと同じで Rows を Append するなら追加元のインスタンスが必要ですよね?

あとは、型付 DataTable に充填したい場合に、型のゆるい通常の DataTable が返って来られても面倒というのを想定しての設計かもしれません。
もしくは、引数と戻り値が別参照だとパフォーマンスに影響 (中身をコピーしなければならない)、逆に参照が同じなら「戻り値」は不要 (別にあってもいいけどw) という考えもあるかもしれませんね。
ただし StringBuilder の Append メソッドという事例もあるので何とも言えません (つまり私の勝手な想像)。
引用返信 編集キー/
■57653 / inTopicNo.9)  Re[6]: メソッドの戻り値と引数について
□投稿者/ furu (14回)-(2011/03/07(Mon) 20:56:00)
No57638 (じゃんぬねっと さん) に返信
> ただし StringBuilder の Append メソッドという事例もあるので何とも言えません (つまり私の勝手な想像)。

StringBuilder の Append メソッドは、c言語のstrcat関数のアッパーコンパチ的な雰囲気ですよね。
便利で変数が一回でいいから品質も高いけど戻す分遅そう。最適化できないし。

     sb.Append(a)
.Append(b)
.Append(c);

ab.Append(a);
ab.Append(b);
ab.Append(c);

それはさておき、皆さんのご意見をということなので

エラーを例外でなく、boolで返しているので
コレクションの場合、引数がほとんどです。
関数なので、本当は戻り値で返したいです。(複数の戻り値ほしい)

また、戻り値が違うoverloadが定義できないので
仕方なしに引数にすることもあります。

引用返信 編集キー/
■57695 / inTopicNo.10)  Re[1]: メソッドの戻り値と引数について
□投稿者/ くり太郎 (1回)-(2011/03/09(Wed) 13:30:30)
くり太郎 さんの Web サイト
No57615 (ちゃん さん) に返信
> 例えばファイル内容を読み込み、結果をコレクションに格納するようなメソッドで、
> 戻り値をコレクションにするか、引数をコレクションにするかで悩んでいます。

ファイル内容を読み込んで、結果をコレクションに格納するようなメソッドなら、自分ならこんな感じにします。

public IEnumerable<T> LoadFile<T>(string filename) {
// 実装・・・
}

すでに存在するコレクションの要素に追加する場合は、こんな感じにします。

public void AppendCollection<T>(IEnumerable collection, T item) {
// 実装・・・
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -