無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

VB.NETをつつく26−引数の参照渡し。時には曖昧にしておくのがベスト。

今回は要望があったメソッド引数への参照引き渡しをつつくよ。メソッドへの値の渡し方は、 値引き渡し参照引き渡しの2つがあるんだ。 この2つの違いは、代名詞と固有名詞の違いと覚えておくといいピヨ。これはどういうことか現実の話しで例えるピヨ。
値渡しの場合は、「この原価計算報告書を部長に渡してね」と直接対象を指して言っているのと同じなんだ。一方参照渡しの場合は、「この書類部長に渡してね」と間接的に対象を指しているということなんだ。つまり、この2つの言い方の違いは、 替えが可能かどうかなんだ。 先ほどの例で言うと、原価計算報告書と違う書類を渡した時、 値引き渡しの場合は「おいおい○○。これ原価計算報告書じゃないぞ。」と注意されるのに対して、 参照引き渡しの場合は何も言われない。だって「書類」って曖昧に言っているからね。
何故このように2つの引渡し方法がVB.NETにあるのかというと、 プログラムの柔軟性効率性を高めようとしているからなんだよ。 論よりもプログラミング。毎度御馴染みサンプルコードを実行してからよく見て。

Imports System
Imports System.Diagnostics

Module Module1

    Sub Main()
        Dim watch As Stopwatch = New Stopwatch()
        Const max As Integer = 1000000
        Dim result As Double = 0

        '値引渡し
        watch.Start()
        For i As Integer = 0 To max
            result = Calculate(i)
            'resultを使って何かの計算をする
        Next
        watch.Stop()
        Console.WriteLine( _
            "値引渡し時の実行時間は{0}ミリ秒です。", _
            watch.ElapsedMilliseconds)

        '参照引渡し
        watch.Reset()
        watch.Start()
        For i As Double = 0 To max
            result = i
            RefCalculate(result)
            'resultを使って何かの計算をする
        Next
        watch.Stop()
        Console.WriteLine( _
            "参照引渡し時の実行時間は{0}ミリ秒です。", _
            watch.ElapsedMilliseconds)
    End Sub

    Private Function Calculate(ByVal value As Integer) As Double
        Return value * DateTime.Now.Millisecond
    End Function

    Private Sub RefCalculate(ByRef value As Double)
        value *= DateTime.Now.Millisecond
    End Sub
End Module

どう?値引渡しと参照引渡しどちらが速かった?この状況で参照引き渡しの方が速い理由は 同じ変数を使いまわせるからなんだ。 値引渡しの場合は実行環境が毎回値を作成しているから、何度も使いまわしする場合にはスピードが落ちるんだ。 だから、参照引渡しの使い方をマスターしておくと、より効率がいいプログラムが組めるんだよ。 何度も試してマスターしておこう。
でも正直に言うと、このサンプルのスピードは、引渡し方法だけではなくてキャストが影響しているんだけど、それについては難しいから今後説明するピヨ。
説明終わり。ということでこの記事は終わり。
追記:
この記事はボックス化を同時に説明しようとして失敗しました。そこで、只今応急処置としてボックス化をキャストへ修正しました。後日改めて「ボックス化/アンボックス化」、「参照引渡し」、「キャスト」、「ボックスとキャストの違い」を各記事に分けて書きます。
別窓 | VB.NET | コメント:3 | トラックバック:1 | ∧top | under∨
<<英語を啄ばむ3−文字を見極める目が大事。 | 無差別に技術をついばむ鳥 | C++/CLIをつつく26−引数の参照渡し。時には曖昧にしておくのがベスト。>>

この記事のコメント

メソッド引数への参照引き渡しについての説明ですが、大体理解できました。
後は自分なりのプログラムを作って使い方をマスターしたいと思います。
ありがとうございます。
それにしてもネタ好きさんは、すごいですね。
これだけのものをマスターされるのにどのくらい時間を費やしたのですか?
まさしく天才の領域ですね。
2008-07-23 Wed 14:26 | URL | yuda #-[ 内容変更]
>まさしく天才の領域ですね。

いえいえ、そんな事はないですよ。
これは謙遜ではなく、επιστημηさんだったらもっと凄い使い方を知っていると思います。
2008-07-23 Wed 14:45 | URL | インドリ #-[ 内容変更]
yudaさんへ
この記事に不備がある事に今年気付きました。
不備があって申し訳ございませんでした。
2009-05-25 Mon 20:22 | URL | インドリ #-[ 内容変更]
∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

re: これはわかりやすい (・∀・) ですね …
2008-07-23 Wed 14:59 じゃんぬねっと日誌
∧top | under∨
| 無差別に技術をついばむ鳥 |