例1:以下程序我們申請幾個指向不同類型的指針:
10年積累的成都網站設計、成都做網站經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站制作后付款的網站建設流程,更有西夏免費網站建設讓你可以放心的選擇與我們合作。
’使用StructLayout(LayoutKind.Sequential)屬性告訴net編譯器:結構的元素在內存中按其出現的順序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一個4字節數組指針
Dim tabytTest(3) As Byte
’以下語句告訴net垃圾回收進程不對tabytTest進行處理,也就是說tabytTest占用的內存區域固定不變。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字節數組的指針
’取得一個指向32位內存數據的指針,
’由于使用gchandle取指針的方法只能對引用的對象有效,
’所以對如int32等值類型必須使用將其封裝成為一個對象的方法以變為引用類型
Dim ti32Test As Object = Convert.ToInt32(0)
’以下語句告訴net垃圾回收進程不對ti32test進行處理,也就是說ti32Test的內存位置固定不變。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于結構是一種值類型變量,為保證指針申請方便,我們申請
’取得一個和結構tudtTest1大小一致的字節數組指針,只要空間占用長度和結構一樣就可以了
’由于net在結構封裝中會插入額外的數據位,所以一定要用sizeof方法得到結構在非托管使用時的實際大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向結構的指針
’在這兒你可以寫對指針處理的任意代碼(在例2中會給予補充)……
’在使用完畢后一定要釋放指針指向的內存塊,讓垃圾回收器可對這個內存塊回收處理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End If
If thObject2.IsAllocated Then
thObject2.Free()
End If
End Function
上例中指針流程處理可以歸納為:
1、 定義一個具有合適內存長度的引用變量(關于引用變量和值變量的差異可以參觀VB.NET的書籍)
2、使用GCHandle.Alloc方法將變量的內存區域固定下來。
3、使用GCHandle對象的AddrOfPinnedObject取得該內存區域的首地址并賦值給指針變量.
4、對指針進行操作
5、使用GCHandle對象的free方法釋放指針指向的內存區域以便net垃圾回收器可以回收這個內存空間
2、指針所指向數據的存取
在.net中,對指針指向數據的存儲函數都封裝在marshal類中,主要的函數包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針所表示的地址中寫入XXX類型的數據,而ReadXXX中作用就是將指針所在地址的數據以XXX類型方式讀出。看例程2,我們使用這些方法演示對例1那幾個指向不同類型數據的指針作數據存/取操作。
例2:演示向例1申請得到的幾個指針執行寫入及讀取數據的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test變量指向的地址寫入32位整數77
MsgBox("現在ti32Test的值為:" ti32Test) ’因為變量存儲地址的數據已改為77,所以顯示為77
’以下這句之所以可行,因為ti32Test是32位整數,而tpObject指向的tabytTest數組剛好有4個元素
’而每一個byte元素都占用8位,合起來就是32位,和ti32Test占用的空間一樣。這就印證了前面提’
’到的net中指針沒有指向類型的說明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代碼再將tabytTest字節數組的內容理解為一個int32整數,
’并將值賦值給tudtTest結構中的int32元素
’我們使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在結構中的內存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就臨時產生了
’一個指針并指向i32a所在的內存地址(, 這個方法也說明了指針可以以字節為單位進行加減計算以指向合適的變量。
’Marshal.ReadInt32的作用是從指針中讀取一個32整數。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’這兒可以將字節數組的內容復制到真正的結構中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("結構tidtTest1中i32a元素的值為:" tudtTest1.i32a) ’此處將顯示剛賦的值77
你好,EnableDisconnectNotification、 EnableWriteNotification 這兩個是外部函數吧,是委托嗎?
建議使用委托可以看看下面的例子
此示例演示如何使用委托將過程傳遞給另一個過程。
委托是一種類型,與任何其他類型一樣可在 Visual Basic 中使用。AddressOf 運算符如果應用到一個過程名,則返回一個委托對象。
此示例有一個具有委托參數的過程,該委托參數可接受對另一個過程的引用,而引用則是通過 AddressOf 運算符獲得的。
創建委托和匹配過程
創建一個名為 MathOperator 的委托。
Visual Basic
復制代碼
Delegate Function MathOperator( _
ByVal x As Double, _
ByVal y As Double _
) As Double
創建一個名為 AddNumbers 的過程,其參數和返回值與 MathOperator 的參數和返回值匹配,以使簽名匹配。
Visual Basic
復制代碼
Function AddNumbers( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x + y
End Function
創建名為 SubtractNumbers 的過程,其簽名與 MathOperator 匹配。
Visual Basic
復制代碼
Function SubtractNumbers( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x - y
End Function
創建一個名為 DelegateTest 的過程,它接受一個委托作為參數。
此過程可接受對 AddNumbers 或 SubtactNumbers 的引用,這是因為它們的簽名與 MathOperator 簽名匹配。
Visual Basic
復制代碼
Sub DelegateTest( _
ByVal x As Double, _
ByVal op As MathOperator, _
ByVal y As Double _
)
Dim ret As Double
ret = op.Invoke(x, y) ' Call the method.
MsgBox(ret)
End Sub
創建一個名為 Test 的過程,它使用 AddNumbers 的委托作為參數調用 DelegateTest 一次,然后使用 SubtractNumbers 的委托作為參數再次調用。
Visual Basic
復制代碼
Protected Sub Test()
DelegateTest(5, AddressOf AddNumbers, 3)
DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub
調用 Test 時,它首先顯示 AddNumbers 對 5 和 3 的操作結果,也就是 8。然后顯示 SubtractNumbers 對 9 和 3 的操作結果,也就是 6。
創建一個名為 MySubDelegate 的委托。
Delegate Sub MySubDelegate(ByVal x As Integer)
聲明一個類,該類包含與該委托具有相同簽名的方法。
Class class1 Sub Sub1(ByVal x As Integer) MsgBox("The value of x is: " CStr(x)) End Sub End Class
定義一個方法,該方法創建該委托的實例并通過調用內置的 Invoke 方法調用與該委托關聯的方法。
Protected Sub DelegateTest() Dim c1 As New class1 ' Create an instance of the delegate. Dim msd As MySubDelegate = AddressOf c1.Sub1 ' Call the method. msd.Invoke(10) End Sub
1. 什么是類和對象?
答:類包含某一類對象的數據和過程。對象是類的實例。
2. 為什么采用類和對象進行程序設計?
答:以便按照對象定義類,提高程序代碼的可重用性,避免重復勞動。
3. 在同一個類中,應當包括哪些對象的屬性和方法?
答:同一類對象的數據和過程。
4. VB程序設計主要包括哪兩個方面的內容?
答:Windows應用程序界面和代碼。
5. 什么是事件驅動?
答:根據事件轉去執行相應的事件處理過程。
1. 控件是窗體上的 對象 。
2. Visual Basic具有 BASIC程序語言簡單易學的 優點,新增了 可視化和面向面向對象程序設計的 熱點,是 Windows編程人員廣泛使用的編程 工具。
3. 對象的 屬性 是在其類中定義的數據。
4. 對象的 方法 是在其類中定義的過程。
5. 對象本身的動作或功能稱為 方法 ,外界施加于某對象的動作或操作稱為 事件 。
1.面向過程
是指從功能的角度分析問題,將待解決的問題空間分解成若干個功能模塊,每個功能模塊描述一個操作的具體過程。
2.面向過程程序設計
主要是根據事務本身的邏輯過程進行編程的一種方法。
3.面向對象程序設計
是一種計算機編程架構,是由單個能夠起到子程序作用的單元或對象組合而成。即按照對象編寫程序。
4.事件驅動程序設計
是一種電腦程式設計模型。這種模型的程式執行流程是由使用者的動作或者是由其他程式的訊息來決定的。
5.函數
是一種特定的運算,在程序中使用一個函數時,只要給出函數名并給出一個或多個參數,就能得到它的函數值
6.過程
是程序中可以執行的一段代碼,過程包含在一個聲明語句和一個結束語句之間
7.類
是所有具有共同特征的事物的抽象,是一個抽象的概念(類是一組具有相同屬性特征的對象的抽象描述,是面向對象程序設計的又一個核心概念或者類是對一組對象共同具有的屬性和行為的抽象,具有封裝和隱藏性、還具有繼承性)。
8.對象
是一個屬性集合及其操作的封裝體(對象是用來描述現實世界中客體的部件,是面向對象軟件系統在運行時刻的基本單位)。
類是對象的抽象,對象是類的實例。
9.事件
窗體或控件識別的動作
10.事件驅動
根據事件轉去執行相應的事件處理過程。
11.屬性
是一個對象的特性,不同的對象有不同的屬性
12.算法
指解決某個問題的嚴格方法,描述有始有終的計算過程。
5.屬性窗口中屬性值被設置的方式有哪幾種?
6種:輸入 選取 瀏覽 賦值 默認 拖動
1.程序代碼是由一行一行的 語句 所組成。
3.在程序代碼中可將一個語句分成兩段的特殊符號為( _ )。
5.數值變量如果沒有設置初值,則內定值為 0 。
7.如果有一個變量,可能會存放數值數據或字符串數據,此時可以聲明該變量為 對象變量。
9. Integer數據類型占 4 bytes的內存空間,可以表示的數值范圍為 -2,147,483,648~2,147,483,647 的整數
3.VB.NET程序語言數據類型的種類有哪些?
(1)數值型
①整形數:短整形(Short)、整形(Integer)、長整型(Long)
②字節型(Byte)
③實型數:單精度型(Single)、雙精度型(Double)
④貨幣型(Decimal)
(2)字符型(Char)和字符串型(String)
(3)邏輯型/布爾型(Boolean)
(4)日期型(Date)
(5)對象型(Object)[即可變型(Variant)]
1.局部變量、全局變量、跨模塊變量分別在何處聲明?其生存期分別是多少?
局部變量在程序內聲明。生存期為從所在的程序運行開始到程序結束。
全局變量在窗體內所有程序的外邊聲明。生存期為由該變量聲明開始,一直到程序退出運行為止。
跨模塊變量在一般模塊的聲明區用Public來聲明。生存期為從一個Windows應用程序項目文件開始運行到結束。
3.什么是靜態變量?
靜態變量是在離開程序時能夠繼續保留目前的值,待下回進入該程序時能夠繼續保留的變量值的局部變量,用Static關鍵字聲明。
(一)問答題
1.請簡單說明在程序中使用程序的好處。
(1)程序可以重復使用,以方便維護與程序調試。
(2)程序可以讓其他工程或項目使用。
(3)程序的邏輯簡單、明確,可以讓程序變得簡單且可讀性高。
(4)程序具有模塊化的功能,因此可以將一個大的應用程序分成數個小的且不同功能的程序,讓不同的程序設計師分別編寫獨立不同功能的程序,并以團隊開發,加快應用程序開發的時間。
3.試比較傳值調用與傳址調用的差異。
(1)聲明方式不同:
傳值——在程序中的虛自變量之前加上ByVal
傳址——在程序中的虛自變量之前加上ByRef
(2)占用內存不同
傳值——調用程序的實自變量與被調用程序的虛自變量占用不同內存
傳址——調用程序的實自變量與被調用程序的虛自變量占用同一地址的內存,也就是說,在做參數傳遞時,調用程序中的實自變量是將自己本身的內存地址傳給被調用程序的虛自變量
(3)虛自變量更改結果不同
傳值——使用傳值調用可以防止變量被程序修改
傳址——被調用程序可以通過虛自變量將值傳回給調用程序
5.什么是程序多載?
程序多載是使用不同的自變量串行或數據類型來加以區分相同名稱的程序。
泛型參數,表示一種特定類型,通常用于集合List, Dictionary之類的。
原型:Dictionary(Of TKey, TValue)
原型不能直接使用,必須給TKey, TValue指定一個類型(Type)
強類型字典:Dictionary(Of String, String)
表示鍵和值都為String類型的字典。
過程名是不可能作為參數使用的,想必你需要調用的過程是有限的,那么可以用一個變量來確定:
sub 過程名(p as integer)
Dim i As Threading.Thread
select case p
case 1
i = New Threading.Thread(AddressOf 過程1)
case 2
i = New Threading.Thread(AddressOf 過程2)
.........................
..........................
end select
i.start()
end sub
Public Function GetTextboxFromFrm(ByVal frm As Control) As List(Of TextBox)
Dim obj As Control
Dim listTB As New List(Of TextBox)
For Each obj In frm.Controls
If TypeOf obj Is TextBox Then
Debug.WriteLine(obj.Name " " obj.Text)
listTB.Add(obj)
Else
If obj.HasChildren Then
listTB.AddRange(GetTextboxFromFrm(obj))
End If
End If
Next
Return listTB
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '我放到按鈕事件里了,你自己改成函數
Dim AllTextBox As List(Of TextBox)
Dim cc() As String '這個數組保存所有文本框的Text
Dim i As Integer = 0
AllTextBox = GetTextboxFromFrm(Me)
For Each tb As TextBox In AllTextBox
ReDim Preserve cc(i)
cc(i) = tb.Text
i += 1
Next
End Sub
網頁名稱:vb.netof用法 vbnet using
網頁URL:http://m.kartarina.com/article16/hgjpdg.html
成都網站建設公司_創新互聯,為您提供小程序開發、微信小程序、品牌網站建設、網站內鏈、用戶體驗、網站改版
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯