- - PR -
C#にてオブジェクトの参照渡しが出来ないです。
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-07-06 11:49
初めまして。
現在C#にて開発を行っているのですが、 以下の様にTableオブジェクトを参照渡ししても中身が渡す前と変わりません。 またC#はオブジェクト型は全て参照渡しとなると認識しております。 どなたか原因が判る方がおられましたら御指摘お願いします。 懸念点:呼び出し側と呼ばれる側はそれぞれ別のプロジェクト配下にしてあります。 (ソリューションは同一です。) <呼び出し側> DataTable table = new DataTable(); eBiz_CommonComponent.DBManager obj = new DBManager(); obj.getDataTable("server=***;database=***;user id=***;password=***;packet size=4096",30,"SELECT * FROM trn_order_head",table); -->ここの時点ではtableに値が入るはずなのですが・・・。 <呼ばれ側> public class DBManager { public void getDataTable(string dbConnString, int cmdTimeOut, string sql, System.Data.DataTable dataTable) { System.Data.SqlClient.SqlConnection sqlConn ; System.Data.SqlClient.SqlDataAdapter sqlAdapter; System.Data.DataSet ds; try { sqlConn = new System.Data.SqlClient.SqlConnection(dbConnString); sqlConn.Open(); sqlAdapter = new System.Data.SqlClient.SqlDataAdapter(sql,sqlConn); ds = new System.Data.DataSet(); sqlAdapter.SelectCommand.CommandTimeout = cmdTimeOut; sqlAdapter.Fill(ds); sqlAdapter.Dispose(); sqlConn.Close(); if(ds.Tables.Count == 1) { dataTable = ds.Tables[0]; --->ここでは問題なく値が入っています。 } else { throw new System.Exception("対象DataTableが一つではありません。"); } } catch(Exception e) { throw new System.Exception(e.ToString()); } if(sqlConn != null) { if(sqlConn.State == ConnectionState.Open) { sqlConn.Close(); } sqlConn = null; } if(sqlAdapter != null) { sqlAdapter.Dispose(); sqlAdapter = null; } if(ds != null) { ds.Dispose(); ds = null; } } } | ||||
|
投稿日時: 2005-07-06 12:09
すみません。
自己解決いたしました。 (C#初心者なので・・・。) 双方に「ref」修飾子と書き込むことで解決いたしました。 <呼び出し側> obj.getDataTable("server=***;database=***;user id=***;password=***;packet size=4096",30,"SELECT * FROM trn_order_head",ref<space>table); <呼ばれ側> public class DBManager { public void getDataTable(string dbConnString, int cmdTimeOut, string sql, ref<space>System.Data.DataTable dataTable) | ||||
|
投稿日時: 2005-07-06 12:10
ref を指定してみてはいかが
_________________ # Future Is On Fire ! | ||||
|
投稿日時: 2005-07-06 12:11
参照渡しが必要な場面とは思えませんけど...
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-07-06 12:14
パラメータは普通、値渡しだと思います。 解決方法 1.取得したDataTableの中身をパラメータのDataTableに追加する 2.パラメータのDataTableをrefにする 3.戻り値で、DataTableを返す あと、finallyとか使ったほうが良いです。 #スペルミスです・・ [ メッセージ編集済み 編集者: 餅宮餅喜 編集日時 2005-07-06 12:15 ] [ メッセージ編集済み 編集者: 餅宮餅喜 編集日時 2005-07-06 12:17 ] | ||||
|
投稿日時: 2005-07-06 13:07
"値型-参照型"
と "値渡し-参照渡し" は全く関係ない概念ですので、区別されるとよろしいかと。 | ||||
|
投稿日時: 2005-07-06 13:41
>"値型-参照型" と "値渡し-参照渡し"
すみません。 ヘルプを読み直したところ勘違いに気づきました。 2つを混同しておりました。 御指摘ありがとうございます。 >パラメータは普通、値渡しだと思います。 今回の様にオブジェクトが大きくなる可能性がある場合は、 個人的にはメモリの確保のしかたからref のほうが良いと思っております。 みなさま御指摘ありがとうございます。 | ||||
|
投稿日時: 2005-07-06 13:46
この例では、refにしたところで渡したDataTableインスタンスはそのまま破棄されるだけで、ただの無駄だと思いますが。 返値で返した方が単純にスマートだと思います。 |
1|2|3
次のページへ»