- - PR -
メソッドの戻り値について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-07-11 19:36
vs2003/asp.net from c#
お世話になります。 早速ですが、メソッドの戻り値について お聞きしたいのですが、下の場合、 戻り値のDataSetは値渡しでしょうか? 参照渡しでしょうか? テストする前は参照渡しかと 思っていたのですが、下記の通り、 メソッド内でDataSetをDisposeしているにも かかわらず、呼び元で値が参照出来ます。 ということは値渡しと推測出来るのですが 推測の域を出ません。 また、値渡しであった場合、 当メソッド内にDataSetのDisposeは 必要と思っているのですが、 どうでしょうか? ==================================== private DataSet getDataSet() { SqlConnection sqlCon = null; //SQLコネクション SqlDataAdapter dAdapter = null; //SQLデータアダプタ DataSet DS=null; //SQLデータセット try { //'-----□DataSetを作成 DS = new DataSet(); dAdapter.Fill(DS); } finally { DS.Dispose(); dAdapter.Dispose(); sqlCon.Close(); sqlCon.Dispose(); } return DS; } ==================================== | ||||
|
投稿日時: 2006-07-11 19:38
戻り値は値渡しです。参照渡しにはできません。
引数に使う場合も、ref/out キーワードを使わないと参照渡しにはなりません。 それとは別に、.NET には参照型と値型の区別があります。 C# では class/struct ですね。 この辺を調べてみてください。 | ||||
|
投稿日時: 2006-07-11 20:04
Hongliang様有難う御座います。
という事は、Return DS時点において クラス側のDataSetインスタンスと 呼び元側のDataSetインスタンスが 2つ出来ると言う事でしょうか? | ||||
|
投稿日時: 2006-07-11 20:13
いいえ、違います。
| ||||
|
投稿日時: 2006-07-11 20:57
参照型を値渡しするというのは C/C++ でいうポインタ渡しと
同義という事は調べてわかったのですが・・・。 つまり、実態は一つで、ポインタが渡されるので DataSetのDisposeはしてはダメなんだなと。 ただ、上記のロジックで、DisposeしているDataSetの値を 呼び元で取れるというのが、やはり腑に落ちない ところではあります。 つまり、インスタンスが無い状態で 呼び元はそのポインタを持ってても指し示す場所に 実態が無いのであれば、値が出ないと思うのですが、 間違ってますかね・・・。 | ||||
|
投稿日時: 2006-07-11 21:58
Hongliang さんが 2 度も同じことを提案しているのですが、理解されていないようですね... 「値渡し」「参照渡し」 は、とりあえずおいといて、「値型」 と 「参照型」 について理解してください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-07-11 22:11
ついでに Dispose に対する誤解もあるようです。
Dispose は C++ のデストラクタとは何の関係もない、全く別の概念です。インスタンスを破棄するものではありません。自分が占有するメモリ以外のリソースを解放するためのメソッドです。 | ||||
|
投稿日時: 2006-07-11 22:28
「値型の値渡し」
「値型の参照渡し」 「参照型の値渡し」 「参照型の参照渡し」 がある、と言えば何となくわかるかな。 _________________ 囚人のジレンマな日々 |