国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VB.Net中文教程(7) Me參考值

2024-07-10 13:01:17
字體:
來源:轉載
供稿:網友
  • 網站運營seo文章大全
  • 提供全面的站長運營經驗及seo技術!
  • 1. 使用me參考值
    1.1 認識me參考值

    類別之程序成員(procedure member) 各含一個me參考變量﹐它永遠參考到「目前對象」(current object)。目前對象就是正接受并處理訊息之對象。例如﹐

    'ex01.bas
    imports system.componentmodel
    imports system.drawing
    imports system.winforms
    '------------------------------------------------------------------------------
    public class fee
    private amount as decimal

    public sub new(byval amt as decimal)
    me.amount = amt
    end sub
    public sub disp()
    messagebox.show("amount is " + str( me.amount ))
    end sub
    end class
    '--------------------------------------------------------------------------------
    public class form1
    inherits system.winforms.form

    public sub new()
    mybase.new()
    form1 = me
    'this call is required by the win form designer.
    initializecomponent()
    'todo: add any initialization after the initializecomponent() call
    end sub
    'form overrides dispose to clean up the component list.
    public overrides sub dispose()
    mybase.dispose()
    components.dispose()
    end sub
    #region " windows form designer generated code "
    .......
    #end region
    protected sub form1_click(byval sender as object,
    byval e as system.eventargs)
    dim a as new fee(100)
    dim b as new fee(80)
    a.disp()
    b.disp()
    end sub
    end class

    此程序輸出如下﹕amount is 100
    amount is 80


    a 和 b是fee類別之對象。當計算機執行指令──
    a.disp()

    a 就是目前對象﹐disp()程序里的me正參考到對象a。


    也可看成:

    圖1、 me參考值與目前對象

    請注意﹕me參考到對象a﹐也就是me與a皆參考到同一個對象。
    當計算機執行另一指令── b.disp()時,b 即為目前對象﹐而disp()程序之me參考正指向對象 b。


    由于me正參考到對象b﹐所以me與b參考到同一個對象。寫程序時﹐宜充分利用me參考。



    1.2 程序傳回me參考值

    在應用上﹐程序常傳回me參考值﹐可創造奇妙的效果﹐這種效果也是vb的重要特色。希望您能仔細了解me指針之使用場合﹐能讓您寫出完美的oop程序來﹗現在﹐請看個熟悉的程序──

    'ex02.bas
    imports system.componentmodel
    imports system.drawing
    imports system.winforms
    '------------------------------------------------------------------------------
    public class money
    private balance as decimal
    public sub new(byval amount as decimal)
    balance = amount
    end sub
    public sub add(byval saving as decimal)
    balance = balance + saving
    end sub
    public sub display()
    messagebox.show("balance is " + str(balance))
    end sub
    end class
    '--------------------------------------------------------------------------------
    public class form1
    inherits system.winforms.form

    public sub new()
    mybase.new()
    form1 = me
    'this call is required by the win form designer.
    initializecomponent()
    'todo: add any initialization after the initializecomponent() call
    end sub
    'form overrides dispose to clean up the component list.
    public overrides sub dispose()
    mybase.dispose()
    components.dispose()
    end sub
    #region " windows form designer generated code "
    .......
    #end region
    protected sub form1_click(byval sender as object,
    byval e as system.eventargs)
    dim orange as new money(100)
    orange.add(300)
    orange.add(80)
    orange.display()
    end sub
    end class

    此程序輸出如下﹕balance is 480

    money 類別的 balance資料﹐記錄存款余額。main()內之對象orange接受兩訊息──add(300)及add(80) ﹐欲存入兩項金額。



    指令── orange.add(300)
    orange.add(80)

    表示﹕先存入 300元再存入80元﹐有先后次序。若上述圖形改為──



    則更具次序感。于是﹐上述指令相當于──



    這種效果﹐不太陌生吧﹗回憶小學時,班長喊著:「起立、敬禮、坐下」,您不是連續接受到三個訊息嗎?漸漸地﹐您已能設計出像日常生活這般親切之對象了。不過﹐俗語說﹕「萬丈高樓平地起」﹐還是必須先對me參考有充分了解才行﹗請看個程序──

    'ex03.bas
    imports system.componentmodel
    imports system.drawing
    imports system.winforms
    '-----------------------------------------------------------------------------------
    public class money
    private balance as decimal
    public sub new(byval amount as decimal)
    balance = amount
    end sub
    public function add(byval saving as decimal) as money
    balance = balance + saving
    add = me
    end function
    public sub display()
    messagebox.show("balance is " + str(balance))
    end sub
    end class
    '----------------------------------------------------------------------------------
    public class form1
    inherits system.winforms.form

    public sub new()
    mybase.new()
    form1 = me
    'this call is required by the win form designer.
    initializecomponent()
    'todo: add any initialization after the initializecomponent() call
    end sub
    'form overrides dispose to clean up the component list.
    public overrides sub dispose()
    mybase.dispose()
    components.dispose()
    end sub
    #region " windows form designer generated code "
    .......
    #end region
    protected sub form1_click(byval sender as object,
    byval e as system.eventargs)
    dim orange as new money(100)
    orange.add(300).add(80)
    orange.display()
    end sub
    end class

    此程序輸出如下﹕balance is 480
    由于me永遠參考到目前對象﹐此刻me正參考到對象orange。


    圖2、 程序傳回目前對象之參考值

    oragne對象就是me所指之對象﹐也可以說me與orange皆參考到同一個對象。指令──
    add = me

    傳回目前對象之參考值──即orange對象之參考。add() 程序之定義──



    于是add()把目前對象之參考值me傳回form1_click()。此刻﹐orange.add(300)之值也是參考值,與orange參考到同一個對象。


    于是,form1_click()程序之指令──



    成為orange對象之別名了。
    原來的指令── orange.add(300).add(80)
    相當于── orange.add(80)

    不過﹐此時orange對象之 balance變量值為400元﹐而非原來的100元了。此orange再接受訊息── add(80)﹐其 balance值增加為480 元。orange接到第 2個訊息── add(80)時﹐計算機再執行add() 程序﹐其再度傳回orange的參考值﹐使得整個指令──

    又成為orange之別名。因之﹐亦能把disp()訊息接于其后﹐如下﹕

    'ex04.bas
    imports system.componentmodel
    imports system.drawing
    imports system.winforms
    '------------------------------------------------------------------------------------
    public class money
    private balance as decimal
    public sub new(byval amount as decimal)
    balance = amount
    end sub
    public function add(byval saving as decimal) as money
    balance = balance + saving
    add = me
    end function
    public sub display()
    messagebox.show("balance is " + str(balance))
    end sub
    end class
    '-------------------------------------------------------------------------------------
    public class form1
    inherits system.winforms.form

    public sub new()
    mybase.new()
    form1 = me
    'this call is required by the win form designer.
    initializecomponent()
    'todo: add any initialization after the initializecomponent() call
    end sub
    'form overrides dispose to clean up the component list.
    public overrides sub dispose()
    mybase.dispose()
    components.dispose()
    end sub
    #region " windows form designer generated code "
    .......
    #end region
    protected sub form1_click( byval sender as object,
    byval e as system.eventargs)
    dim orange as new money(100)
    orange.add(300).add(80).display()
    end sub
    end class

    此程序輸出如下﹕balance is 480
    orange對象接到第 1個訊息──add(300)﹐計算機就執行add()程序,執行到結尾指令﹐傳回me(即orange對象)參考值。此時form1_click()的orange.add(300)就是orange對象之參考值﹐亦即orange.add() 是orange對象之別名﹔則orange和 orange.add(300)重合在一起﹐代表著同一對象──原來的orange對象。



    接下來﹐第 2個訊息──add(80)傳給orange.add(300) ﹐相當于傳給orange對象。再度執行到 add()里的的add = me指令時﹐又令orange.add(300).add(80) 成為 orange.add(300)之別名﹐即orange之別名﹔于是﹐三者代表同一對象──原來的orange對象。



    接下來﹐第3個訊息──display傳給orange.add(300).add(80) ﹐相當于傳給orange對象。

    于是輸出orange對象內的balance值。
    以程序傳回me參考值之技巧將應用于許多方面。為了更了解這種方法﹐請看個特殊情形── 程序傳回新對象之參考值。此對象不是目前對象,但內容是從目前對象拷貝而來。這不同于傳回me參考值的情形﹐兩種用法常令人搞混﹗現在﹐把程序改為──

    'ex05.bas
    imports system.componentmodel
    imports system.drawing
    imports system.winforms
    '------------------------------------------------------------------------------------
    public class money
    private balance as decimal
    public sub new(byval amount as decimal)
    balance = amount
    end sub
    public function add(byval saving as decimal) as money
    dim newobj as money
    newobj = new money( balance + saving )
    add = newobj
    end function
    public sub display()
    messagebox.show("balance is " + str(balance))
    end sub
    end class
    '-------------------------------------------------------------------------------------
    public class form1
    inherits system.winforms.form

    public sub new()
    mybase.new()
    form1 = me
    'this call is required by the win form designer.
    initializecomponent()
    'todo: add any initialization after the initializecomponent() call
    end sub
    'form overrides dispose to clean up the component list.
    public overrides sub dispose()
    mybase.dispose()
    components.dispose()
    end sub
    #region " windows form designer generated code "
    .......
    #end region
    protected sub form1_click( byval sender as object,
    byval e as system.eventargs)
    dim orange as new money(100)
    orange.add(300).add(80).display()
    end sub
    end class

    此程序輸出如下﹕balance is 480

    當orange對象接到第 1個訊息──add(300)﹐計算機就執行add()程序﹐誕生一個money類別的新對象﹐把目前對象內容(即orange對象之值)拷貝一份給form1_click()。這份拷貝就是orange.add(300)之值。

    orange.add(300) 即為拷貝回來的那份對象﹐并非原來的orange對象。當訊息──add(80)傳給orange.add(300)所代表的對象時﹐計算機就執行add()函數﹐此時目前對象是orange.add(300) 而非原來的orange。執行時﹐又把目前對象──orange.add(300)內容拷貝一份給新誕生的對象,傳回給form1_click()程序﹐這份拷貝就是orange.add(300).add(80) 之值。



    由于每回執行add()就產生一份新對象(雖然內容相同﹐但占不同的內存空間)﹐其后的訊息皆傳給add()所誕生之新對象﹐而非orange對象,所以這些訊息皆不影響原來orange對象之內容。
    請注意﹕display()并未傳回對象之參考值﹐則display()訊息之后不得再接其它訊息了。所以﹐如果form1_click()程序改寫如下,那就錯了──

    protected sub form1_click( byval sender as object,
    byval e as system.eventargs)
    dim orange as new money(100)
    orange.add(300).display().add(80) 'error!
    end sub
    end class

    因display()不傳回對象之參考值﹐則指令──

    其后之訊息──add(80) 是錯的。如何改正呢﹖很簡單﹐只需叫display()程序傳回 me(目前對象之參考值)或新對象之參考值即可﹐如下﹕

    'ex06.bas
    imports system.componentmodel
    imports system.drawing
    imports system.winforms
    '-------------------------------------------------------------------------------------
    public class money
    private balance as decimal
    public sub new(byval amount as decimal)
    balance = amount
    end sub
    public function add(byval saving as decimal) as money
    dim newobj as money
    newobj = new money( balance + saving )
    add = newobj
    end function
    public function display() as money
    messagebox.show("balance is " + str(balance))
    display = me
    end function
    end class
    '-----------------------------------------------------------------------------------
    public class form1
    inherits system.winforms.form

    public sub new()
    mybase.new()
    form1 = me
    'this call is required by the win form designer.
    initializecomponent()
    'todo: add any initialization after the initializecomponent() call
    end sub
    'form overrides dispose to clean up the component list.
    public overrides sub dispose()
    mybase.dispose()
    components.dispose()
    end sub
    #region " windows form designer generated code "
    ........
    #end region
    protected sub form1_click(byval sender as object,
    byval e as system.eventargs)
    dim orange as new money(100)
    orange.display().add(300).display().add(80).display()
    end sub
    end class

    此程序輸出﹕
    balance is 100
    balance is 400
    balance is 480

    此程序中﹐orange先接受display()訊息﹐印出存款額﹔再接受add(300)訊息﹐使存款額提高 300元﹐再接受display()訊息﹐依序下去。display()傳回來目前對象orange之參考值,add()則傳回新誕生對象之參考值。



    2. 深入了解me參考

    vb在編譯時﹐會自動為程序成員產生me參考變量﹐并令me固定參考到目前對象(current object)。于此將細談vb如何產生me參考變量﹐讓您更能深刻了解me參考變量的特性和角色。首先﹐vb在編譯程序成員時﹐會暗中偷加上1 個參考參數──me﹐成為該程序成員的第1 個參數。例如﹕


    class person
    private name as string
    priavte age as integer
    public sun new(byval na as string, byval a as integer)
    name = na
    age = a
    end sub
    public sub display()
    messagebox.show( name + ", " + str( age ) )
    end sub
    end class

    在編譯此程序時﹐vb會將偷加上me參考變量如下﹕

    class person
    private name as string
    priavte age as integer
    public sun new( byval me as person, byval na as string,
    byval a as integer)
    me.name = na
    me.age = a
    end sub
    public sub display(byval me as person)
    messagebox.show( me.name + ", " + str( me.age ) )
    end sub
    end class

    無論是在new()或display()程序里﹐me皆固定參考到目前對象﹐您不能改變me之值。接下來﹐請看如何令me參考到目前對象﹖假如有個form1_click()程序如下﹕

    sub form1_click( .... )
    dim x as new person("tom", 26)
    x.display()
    end sub


    vb在編譯時﹐會把指令──x.display()轉換為﹕
    person_display(x)

    意謂著﹕呼叫person類別的display()程序來處理x 對象之內容。在呼叫這程序時﹐就把x參考值傳遞給display()程序里的me參數﹐如下﹕


    于是﹐me就固定指向x對象了﹐而這x 對象就是我們欲處理之對象﹐亦
    即就是目前對象了。請再看個例子吧﹗若person類別改為﹕

    class person
    private name as string
    priavte age as integer
    public sun new(byval na as string, byval a as integer)
    name = na
    age = a
    end sub
    public sub print()
    me.display()
    end sub
    public sub display()
    messagebox.show( name + ", " + str( age ) )
    end sub
    end class





    則vb會為這3 個程序成員加上me參考值。其中print()程序轉換如下﹕

    public sub print(byval me as person)
    person_display( me )
    end sub

    上述的me.display()轉換為person_display( me )之后﹐就把這print()內的me值傳給了display()內的me了﹐此時兩個程序內的me皆參考到目前對象了。
    以上所提的一般程序成員并不包括共享程序成員(shared member function)。還記得嗎﹖共享程序成員的目的是﹕處理有關整個類別的事情﹐而不是用來處理對象之內容。在另一方面﹐me參考到目前對象﹐一般程序成員經由me來存取目前對象之內容。既然共享程序成員不需存取某特定對象之值﹐當然就不需要me參考變量了﹐因之vb并不會為共享程序成員偷加上me參考變量。簡而言之﹐vb的規則是──

    「vb編譯時﹐并不會為共享程序成員加上me參考變量﹐所以
    共享程序成員里沒有me參考變量﹐也就無法存取對象之內容」

    如前面所述﹐在呼叫一般程序成員時﹐必須把目前對象之參考值傳遞過去給該程序成員。但共享程序成員里并無me參考﹐所以無法呼叫一般程序成員??傻弥獀b的規則──
    「共享程序成員不能呼叫一般程序成員﹐但可呼叫別的共享程序成員」

    反之﹐一般程序成員卻可呼叫共享程序成員。例如﹕





    class person
    private name as string
    priavte age as integer
    shared plast as person

    public sun new(byval na as string, byval a as integer)
    name = na
    age = a
    plast = me
    end sub
    shared sub displast()
    plast.display()
    'display() error !!
    end sub
    public sub print()
    displast()
    end sub
    public sub display()
    messagebox.show( name + ", " + str( age ) )
    end sub
    end class

    display()是一般程序成員﹐共享程序成員displast()不能直接呼叫display()程序如下﹕
    shared sub displast()
    display() error !!
    end sub

    因為vb會將之轉換為──

    shared sub displast()
    person_display( me ) error !!
    end sub

    但displast()是共享程序成員﹐并無me參考變量﹐所以錯了。至于print()
    呼叫displast()﹐vb將之轉換為──

    public sub print( byval me as person )
    person_displast()
    end sub

    雖然print() 內有me參考﹐但displast()是靜態程序成員并不需要me
    ﹐print() 并未把me傳給displast()﹐這是對的。n

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 元朗区| 基隆市| 庆元县| 浦城县| 资讯 | 全椒县| 女性| 河东区| 宜春市| 宾川县| 蚌埠市| 梅河口市| 揭西县| 满洲里市| 蒲江县| 武宣县| 五华县| 湘潭市| 五莲县| 土默特左旗| 柞水县| 琼结县| 繁昌县| 小金县| 阳朔县| 玛多县| 南平市| 嘉峪关市| 兴国县| 正蓝旗| 老河口市| 洛浦县| 红河县| 伊宁市| 治多县| 威信县| 浦县| 太仆寺旗| 长武县| 红安县| 胶南市|