VB.NET參數傳遞_ByVal和ByRef



故事是這樣的
某一天小年輕工程師
接受到了  老闆交代的任務

當中這項任務中其中一小塊牽涉到

需要進行介面輸入的動作  功能設計
顯示  消費者購買東西時的價格計算
假設呢  他現在購買滿1000就打9折之類的
打8折的話就乘0.8
打75折的話就乘0.75
以此類推  打9折  就是  乘上 0.9
===============================================
假設買東西共花  1000元 就打九折
計算是這樣
1000*0.9 = 900元
===============================================
看似簡單 、 感覺不難


因此年輕小工程師  心想這有捨麼難的呀!!!




所以工程師一聽到就  看到黑影即開槍
立即著手撰寫

先是創建一個Module在當中(也可能是寫在現有架構某個公開的Module中)
定義好一個顯示當前輸入結餘顯示功能的 Subroutine





恩恩  看起來有順利進行顯示


因此他又將程式改寫
===============================================
Form1 Class
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim balance As Decimal = TextBox1.Text
        ShowBalance("You owe", balance)
        Label2.Text = balance.ToString("C")
    End Sub
End Class

Module   (===> VB6留存下之 Global 概念)

Module Module1
    Public Sub ShowBalance(message As String, amount As Decimal)
        amount *= 0.9
        MessageBox.Show(message & " " & amount.ToString("C"))
    End Sub
End Module

===============================================




原因就在於     
預設  VB.NET  我們所定義的ShowBalance的  Subroutine 中
是以 Call By Value進行傳值的
Call  By  Value 只是單純進行原數值的Copy且改變也只存在於該Subroutine該區塊當中
一離開就會回復原狀喔

Public Sub ShowBalance(message As String, amount As Decimal)
        amount *= 0.9
        MessageBox.Show(message & " " & amount.ToString("C"))
    End Sub

Call By Reference 則是傳該變數數值在記憶體的位址
因此即便脫離該區 Subroutine
也有確實改寫該數值




因此這裡必須修改此問題

要小心注意喔~~~~~


最後修正後Code


Module Module1
    Public Sub ShowBalance(message As String, ByRef amount As Decimal)
        amount *= 0.9
        MessageBox.Show(message & " " & amount.ToString("C"))
    End Sub
End Module


示例影片:












留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header