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

首頁 > 編程 > .NET > 正文

Me關鍵字在.NET中的使用(轉)

2024-07-10 13:02:25
字體:
來源:轉載
供稿:網友
me關鍵字在.net中的使用
www.yescnet.com cnet中文網

me 函數大家都很熟了,在vb6中me只能應用于窗體,但在.net中就沒用這個限制了,快來看看使用方法吧!!!!!!!!

?????? 內容 ??????
v 1. 活用me參考值
1.1認識me參考值
1.2程序傳回me參考值

v 2. 認深入了解me參考值

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參考﹐所以無法呼叫一般程序成員。可得知vb的規則──
「共享程序成員不能呼叫一般程序成員﹐但可呼叫別的共享程序成員」

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

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()﹐這是對的
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 固原市| 清河县| 绍兴县| 北辰区| 通州市| 康乐县| 剑川县| 镇雄县| 双城市| 嘉鱼县| 青铜峡市| 长岭县| 武威市| 宜兰县| 蛟河市| 闸北区| 昭通市| 永州市| 雷波县| 诸暨市| 延长县| 台前县| 枞阳县| 独山县| 乐清市| 沙田区| 项城市| 汨罗市| 香港| 恩平市| 温泉县| 秀山| 长乐市| 汝阳县| 四川省| 西宁市| 汤原县| 滁州市| 湘乡市| 游戏| 河曲县|