- PR -

[vb2005] これってポインタを渡してるのでしょうか?

1
投稿者投稿内容
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-07 17:47
お世話になっております。
WindowsXP, Visual Studio 2005 で開発しております。

コード:

 1. Dim row As DataRow = dbKensin.Tables("hoge").Rows(0)
 2. Dim tbl As DataTable = dbKensin.Tables("hoge")
 3. Dim tbl As Data.DataTable = DirectCast(Me.DataSource, Data.DataTable)


上記のようなコーディングは(きっと)よくやることだと思いますが、
(メモリ?)内部では実際にはどのような動作をしているのでしょうか?
データをコピーしているのか、それともC言語系のようなポインタがやり取りされてるのでしょうか?

たとえば以下のような(前述のコードのナンバーと対応)

コード:

 1. row(1).Item(1) = "aaa"
 2. tbl.Rows.Add(newRow)


ことやると、実際のテーブル("hoge")のセルの値が置き換わったり、テーブルに行が追加されますよね。
とすると、これは変数を宣言した時点でデータをコピーしたわけではないのかな、
と考えるにいたったのですが、これは正しい理解でしょうか?
では、なにやってるのかな、ポインタ渡してるのかな?と思った次第です。

で、触れていない上記の "3." についてなんですが、
先日質問させていただいた、【件名:[vb.net]TextBox + Combobox で DataGridViewComboBoxColumn.DataPropertyName と同様な機能を実装したい】で、
まだ不具合がありまして、
TextBox から ValueMember のデータ型と異なった値(byte型に負数とか)を入力されると Exception になってしまうのです。
で、これを回避するために、

コード:

Dim tbl As Data.DataTable = DirectCast(Me.DataSource, Data.DataTable)
Dim row As Data.DataRow
For Each row In tbl.Rows
If row.Item(Me.ValueMember).ToString = pair.Text.ToString Then
Me.SelectedValue = pair.Text
Exit Sub
End If
Next


こういうロジックを考えたんですが、
「イベントの度にテーブルコピーされちゃたまらんよなぁ
 でも実際、中身をコピーしているんだろうか?」
と思ったのがきっかけです。
アイテム数が10件そこそこのデータで試しても、たいして処理速度がかわったようには感じないのですが・・・
(これからデータ増やしてやってみます)

くだらないことを長々と説明して解りづらいかも知れませんが、
よろしくおねがいします。

[ メッセージ編集済み 編集者: とある根性なし 編集日時 2007-12-07 17:52 ]
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-12-07 18:08
Classは参照渡し、Structureは値渡しになります。
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-07 18:21
ご返信ありがとうございます。

やや、一言で終わってしまいましたね
ヒントいただきましたので、しっかり勉強させていただきます。
ありがとうございました
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-07 18:29
これですね〜
Visual Basic 言語の概念 【値型と参照型】
http://msdn2.microsoft.com/ja-jp/library/t63sy5hs(VS.80).aspx
なるほど〜
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2007-12-08 18:45
しっかり勉強されるとのことなので、これも。

Visual Basic 言語の概念 【引数の値渡しと参照渡しの違い】
http://msdn2.microsoft.com/ja-jp/library/eek064h4(VS.80).aspx

『値型と参照型』と『値渡しと参照渡し』はきっちり区別して理解することをお勧めします。
『何を』『どう』渡しているかを理解しておいたほうがいいですよ。

この例だと、参照型を値渡し(というか値を代入)してます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-10 11:03
引用:

burton999さんの書き込み (2007-12-07 18:08) より:

Classは参照渡し、Structureは値渡しになります。


参照型と参照渡し、値型と値渡しは違うので混同してしまうとまずいような...

Class は参照型なので別の変数に代入すると参照がコピーされます。
参照先は同じなので同じものを示すことになります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-12-10 11:17
引用:

じゃんぬねっとさんの書き込み (2007-12-10 11:03) より:
参照型と参照渡し、値型と値渡しは違うので混同してしまうとまずいような...

Class は参照型なので別の変数に代入すると参照がコピーされます。
参照先は同じなので同じものを示すことになります。



確かに。。。
参照型、値型(Class、Structure)
参照渡し、値渡し(ByRef、ByVal)
はそれぞれ異なる概念ですね。失礼しましたm(__)m
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-10 14:09
みなさまありがとうございます。

言葉って大事ですね。
うろ覚えで物言うので、いつも上司に怒られています

みなさんのアドバイスを元に勉強させていただきます。
ありがとうございました。
1

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