tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル配列のByVal、ByRef渡しについて
記事No4756
投稿日: 2007/01/04(Thu) 17:39
投稿者はじめてのプログラミング
VB.NETを始めて、1ヶ月のプログラマーです。

※質問内容
メインルーチンからソートの処理をする部分をサブルーチンへ渡したいのですが、
配列変数「sort」を「ByRef sort() as Integer」とし、サブルーチン側で
配列引数を受け取るときにオートコンプリート機能
(ドットを入力したときにGerUpperBoundとかが自動表示される機能)が
働きません。
ただ、「変数名 = sort.GerUpperBound(変数名)」と全てを記述すると有効になります。

ちなみに、配列変数「sort」を「ByVal sort() as Integer」とサブルーチン側へ
渡すと配列に付随したメッソド一覧が表示されます。

配列をByVal、ByRefで渡したときに上記のような違いがおきるのはなぜでしょうか?

私がいま、使用している参考書に「配列データはByRefによる参照私で行う」と書いてあったので
配列をサブルーチンに渡すときは「ByVal」でなく「ByRef 配列名() as 型」と明示して
あげるように意識した方がいいのかなと思ったのですがこの違いはなんだろうと
疑問に思いました。

纏まりのない文章で申し訳ないのですが、お時間ある方
ご回答をお願いいたします。

[ツリー表示へ]
タイトルRe: 配列のByVal、ByRef渡しについて
記事No4761
投稿日: 2007/01/04(Thu) 21:22
投稿者花ちゃん
> 私がいま、使用している参考書に「配列データはByRefによる参照私で行う」と書いてあったので
VB6.0 の参考書でしょうか?  参考書名は?

下記に書いてある事をよく読んでご自分でも試して確認して見て下さい。
http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-6.aspx

[ツリー表示へ]
タイトルRe^2: 配列のByVal、ByRef渡しについて
記事No4765
投稿日: 2007/01/05(Fri) 09:35
投稿者はじめてのプログラミング
はなちゃんさんレスありがとうございます。

> VB6.0 の参考書でしょうか? 参考書名は?
VB.NETの参考書です。
「VB.NET Bible 基礎学習」です、技術評論社から出版されています。


> 下記に書いてある事をよく読んでご自分でも試して確認して見て下さい。
> http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-6.aspx
ありがとうございます、よく読んで試してみます。

[ツリー表示へ]
タイトルRe^3: 配列のByVal、ByRef渡しについて
記事No4766
投稿日: 2007/01/05(Fri) 10:16
投稿者花ちゃん
> 「VB.NET Bible 基礎学習」です、技術評論社から出版されています。

本自体は見ていないので何とも言えませんが、サンプルのコード類を
 http://www.gihyo.co.jp/books/support.php/4-7741-1718-8
見る限りでは、配列を ByVal、ByRef 両方で渡して解説されているように
思うのですが?
7_4_2_2 のサンプル等

又、
>配列変数「sort」を「ByRef sort() as Integer」とし、サブルーチン側で
>配列引数を受け取るときにオートコンプリート機能
が、7_4_3_1 のサンプルと関係しているのなら使い方が間違っていませんか?

[ツリー表示へ]
タイトルRe^4: 配列のByVal、ByRef渡しについて
記事No4767
投稿日: 2007/01/05(Fri) 11:35
投稿者はじめてのプログラミング
> 本自体は見ていないので何とも言えませんが、サンプルのコード類を
>  http://www.gihyo.co.jp/books/support.php/4-7741-1718-8
> 見る限りでは、配列を ByVal、ByRef 両方で渡して解説されているように
> 思うのですが?> 7_4_2_2 のサンプル等
確かにByVal、ByRef 両方で解説してあります。
すいません、見落としていました。

> >配列変数「sort」を「ByRef sort() as Integer」とし、サブルーチン側で
> >配列引数を受け取るときにオートコンプリート機能
> が、7_4_3_1 のサンプルと関係しているのなら使い方が間違っていませんか?
関係しています。
7_4_3_1のサンプルでsort(ByRef a() as Girl)の中で、
例えば、Dim e As Integer = a.GetUpperBound(e)と配列の上限番号を取得したい場合
「ByRef」だとa.とドットを入力した場合、メソッド一覧が表示されません。
これをsort(ByVal a() as Girl)と「ByVal」とすると「a.」とドットを入力した場合、
メソッド一覧が表示されます。
私的には、ByVal、ByRefどちらで配列を渡したとしても、
参照渡しになるので個人的なルールとして、
「ByRef」と記述するクセをつけたほうが正しいと思っていたのですが
「ByRef」だとメソッド一覧が表示されないので.NET的には「ByVal」と
した方がいいのか?どっちだろうと思い質問しました。

教えていただいたMSDNを今読んでいるところですので、
最後まで読んでまた回答させてください。(多分謎が解けると思いますので)

[ツリー表示へ]
タイトルRe^5: 配列のByVal、ByRef渡しについて
記事No4768
投稿日: 2007/01/05(Fri) 13:07
投稿者花ちゃん
> 例えば、Dim e As Integer = a.GetUpperBound(e)と配列の上限番号を取得したい場合
a() の配列の上限番号を取得したいなら UBound(a) では。
又は、
Dim b() As Girl = a
Dim e As Integer = b.GetUpperBound(0)

になるのでは。

[ツリー表示へ]
タイトルRe^6: 配列のByVal、ByRef渡しについて
記事No4769
投稿日: 2007/01/05(Fri) 14:14
投稿者はじめてのプログラミング
花ちゃんさん、何度もご回答ありがとうございます。

> > 例えば、Dim e As Integer = a.GetUpperBound(e)と配列の上限番号を取得したい場合
> a() の配列の上限番号を取得したいなら UBound(a) では。
その通りです。

> 又は、
>  Dim b() As Girl = a
>  Dim e As Integer = b.GetUpperBound(0)
> になるのでは。
こちらは良くわからずに使っていました、教えていただきありがとうございました。
Dim e As Integer = a.GetUpperBound(e)の「e」がIntegerの初期値0だったので
たまたま成立していました。
Dim e As Integer = a.GetUpperBound(配列の次元 -1)
1次元目の上限を取得であれば0となるので
Dim e As Integer = b.GetUpperBound(0)となるのですね。

[ツリー表示へ]
タイトルRe^2: 配列のByVal、ByRef渡しについて
記事No4771
投稿日: 2007/01/05(Fri) 18:52
投稿者はじめてのプログラミング
> 下記に書いてある事をよく読んでご自分でも試して確認して見て下さい。
> http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-6.aspx
自分なりに読んで、試してみて
・値渡しか参照渡しかの違いによって
 実引数と仮引数が一身同体であるかどうかが決まる。
・引数のデータ型が値型か参照型かによって
 引数そのものがデータ実体か、それとも参照情報であるかが決まる。

値渡し(ByVal)や参照渡し(ByRef)と、値型や参照型とは、
別であると、ByValとByRef違いについて、自分なりに理解
できたと思います。

ただ、また元に質問に戻ってしまうのですのですが
なぜ、配列をByVal/ByRefで渡した場合で、メッソド一覧が表示がされたり
されないのかはわかりませんでした。
私の開発環境の設定のせいでしょうか?どこか考えかたが間違っているのでしょうか?
・開発環境
 Windows XP HomeEdition SP2
 VB .NET2003

・ソースです。
-----------------------------------------------------------------
    Private Sub Sort(ByVal bbb() As Integer, ByVal ccc As Integer)
                     ↓↓
    Private Sub Sort(ByRef bbb() As Integer, ByVal ccc As Integer)
        bbb.GetUpperBound(0) 'Byvalの場合、bbb.(ドット)でメッソド一覧が表示される

        bbb.GetUpperBound(0) 'Byvalの場合、bbb.(ドット)でメッソド一覧が表示されない
                             '最後まで記述する
        MsgBox(bbb(0))
        MsgBox(ccc)

        ccc = 500     'ByValの場合、変化しない
        bbb(0) = 0    '同じ実態を参照するので変化
        bbb = Nothing 'ByValの場合、配列自体の参照情報は変化なし
    End Sub
--------------------------------------------------------------------------------------
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim b() As Integer = {84, 121, 43}
        Dim c As Integer = 100

        Sort(b, c)

        If b Is Nothing Then
            '何もしない
        Else
            MsgBox(b(0))
        End If

        MsgBox(c)
    End Sub

[ツリー表示へ]
タイトルRe^3: 配列のByVal、ByRef渡しについて
記事No4772
投稿日: 2007/01/05(Fri) 19:29
投稿者魔界の仮面弁士
「メッソド」ではなく、「メソッド」ですよね。

> bbb.GetUpperBound(0) 'Byvalの場合、bbb.(ドット)でメッソド一覧が表示される
> bbb.GetUpperBound(0) 'Byvalの場合、bbb.(ドット)でメッソド一覧が表示されない

表示されるのやら、されないのやら……。(^-^;


> なぜ、配列をByVal/ByRefで渡した場合で、メッソド一覧が表示がされたり
> されないのかはわかりませんでした。

VB.NET 2002/2003 の問題らしいですよ。ちなみに、2005 では解決されています。

[ツリー表示へ]
タイトルありがとうございました。
記事No4786
投稿日: 2007/01/09(Tue) 17:16
投稿者はじめてのプログラミング
> VB.NET 2002/2003 の問題らしいですよ。ちなみに、2005 では解決されています。
魔界の仮面弁士さん、返信が遅くなりました。
納得しました、ご回答ありがとうございました。

[ツリー表示へ]