- PR -

メソッドの戻り値について

投稿者投稿内容
サイトウ
会議室デビュー日: 2005/07/31
投稿数: 18
投稿日時: 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;
}
====================================
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-07-11 19:38
戻り値は値渡しです。参照渡しにはできません。
引数に使う場合も、ref/out キーワードを使わないと参照渡しにはなりません。

それとは別に、.NET には参照型と値型の区別があります。
C# では class/struct ですね。
この辺を調べてみてください。
サイトウ
会議室デビュー日: 2005/07/31
投稿数: 18
投稿日時: 2006-07-11 20:04
Hongliang様有難う御座います。

という事は、Return DS時点において
クラス側のDataSetインスタンスと
呼び元側のDataSetインスタンスが
2つ出来ると言う事でしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-07-11 20:13
いいえ、違います。

引用:

それとは別に、.NET には参照型と値型の区別があります。
C# では class/struct ですね。
この辺を調べてみてください。

サイトウ
会議室デビュー日: 2005/07/31
投稿数: 18
投稿日時: 2006-07-11 20:57
参照型を値渡しするというのは C/C++ でいうポインタ渡しと
同義という事は調べてわかったのですが・・・。
つまり、実態は一つで、ポインタが渡されるので
DataSetのDisposeはしてはダメなんだなと。

ただ、上記のロジックで、DisposeしているDataSetの値を
呼び元で取れるというのが、やはり腑に落ちない
ところではあります。

つまり、インスタンスが無い状態で
呼び元はそのポインタを持ってても指し示す場所に
実態が無いのであれば、値が出ないと思うのですが、
間違ってますかね・・・。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-11 21:58
引用:

めだかさんの書き込み (2006-07-11 20:57) より:

参照型を値渡しするというのは C/C++ でいうポインタ渡しと同義という事は調べてわかったのですが・・・。つまり、実態は一つで、ポインタが渡されるので DataSetのDisposeはしてはダメなんだなと。
ただ、上記のロジックで、DisposeしているDataSetの値を呼び元で取れるというのが、やはり腑に落ちないところではあります。
つまり、インスタンスが無い状態で呼び元はそのポインタを持ってても指し示す場所に実態が無いのであれば、値が出ないと思うのですが、間違ってますかね・・・。


Hongliang さんが 2 度も同じことを提案しているのですが、理解されていないようですね...
「値渡し」「参照渡し」 は、とりあえずおいといて、「値型」 と 「参照型」 について理解してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-07-11 22:11
ついでに Dispose に対する誤解もあるようです。
Dispose は C++ のデストラクタとは何の関係もない、全く別の概念です。インスタンスを破棄するものではありません。自分が占有するメモリ以外のリソースを解放するためのメソッドです。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-07-11 22:28
「値型の値渡し」
「値型の参照渡し」
「参照型の値渡し」
「参照型の参照渡し」
がある、と言えば何となくわかるかな。
_________________
囚人のジレンマな日々

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