偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

關(guān)于使用VB.NET ANY問(wèn)題要點(diǎn)總結(jié)

開(kāi)發(fā) 后端
這里介紹了關(guān)于使用VB.NET ANY時(shí)遇到的問(wèn)題,在VB里大多數(shù)時(shí)候,我們使用Any就是為了使用void*,文章有詳細(xì)的分析。

我們?cè)谑褂弥羔樀臅r(shí)候會(huì)運(yùn)到很多問(wèn)題,不知道你們?cè)诰幊讨杏龅竭^(guò)沒(méi)有,這里把我也前遇到的問(wèn)題分享給大家一些。Any不是一個(gè)真正的類型,它只是告訴VB編譯器放棄對(duì)參數(shù)類型的檢查,這樣,理論上,我們可以將任何類型傳遞給API。Any在什么地方用呢?讓我們來(lái)看看,在VB文檔里的是怎么說(shuō)的,現(xiàn)在就請(qǐng)打開(kāi)MSDN(Visual Studio 6自帶的版本),翻到"Visual Basic文檔"->"使用Visual Basic"->"部件工具指南"->"訪問(wèn)DLL和Windows API"部分,再看看"將 C 語(yǔ)言聲明轉(zhuǎn)換為 Visual Basic 聲明"這一節(jié)。文檔里告訴我們,只有C的聲明為L(zhǎng)PVOID和NULL時(shí),我們才用VB.NET ANY。實(shí)際上如果你愿意承擔(dān)風(fēng)險(xiǎn),所有的類型你都可以用Any。當(dāng)然,也可以如我所說(shuō),永遠(yuǎn)不要用VB.NET ANY。

為什么要這樣?那為什么VB官方還要提供Any?是信我的,還是信VB官方的?有什么道理不用VB.NET ANY?

#T#如前面所說(shuō),VB官方不鼓勵(lì)我們使用指針。因?yàn)閂B所標(biāo)榜的優(yōu)點(diǎn)之一,就是沒(méi)有危險(xiǎn)的指針操作,所以的內(nèi)存訪問(wèn)都是受VB運(yùn)行時(shí)庫(kù)控制的。在這一點(diǎn)上,JAVA語(yǔ)言也有著同樣的標(biāo)榜。但是,同JAVA一樣,VB要避免使用指針而得到更高的安全性,就必須要克服沒(méi)有指針而帶來(lái)的問(wèn)題。VB已經(jīng)盡***的努力來(lái)使我們遠(yuǎn)離指針的同時(shí)擁有強(qiáng)類型檢查帶來(lái)的安全性。但是操作系統(tǒng)是C寫的,里面到處都需要指針,有些指針是沒(méi)有類型的,就是C程序員常說(shuō)的可怕的 void*無(wú)類型指針。它沒(méi)有類型,因此它可以表示所有類型。如CopyMemory所對(duì)應(yīng)的是C語(yǔ)言的memcpy,它的聲明如下:

  1. void *memcpy( void *dest, const void *src, size_t count ); 

因memcpy前兩個(gè)參數(shù)用的是void*,因此任何類型的參數(shù)都可以傳遞給他。一個(gè)用C的程序員,應(yīng)該知道在C函數(shù)庫(kù)里這樣的void*并不少見(jiàn),也應(yīng)該知道它有多危險(xiǎn)。無(wú)論傳遞什么類型的變量指針給上面memcpy的void*,C編譯器都不會(huì)報(bào)錯(cuò)或給任何警告。在VB里大多數(shù)時(shí)候,我們使用Any就是為了使用void*,和在C里一樣,VB也不對(duì)Any進(jìn)行類型檢查,我們也可以傳遞任何類型給Any,VB編譯器也都不會(huì)報(bào)錯(cuò)或給任何警告。但程序運(yùn)行時(shí)會(huì)不會(huì)出錯(cuò),就要看使用它時(shí)是不是小心了。正因?yàn)樵贑里很多錯(cuò)誤是和void*相關(guān)的,所以,C++鼓勵(lì)我們使用satic_cast來(lái)明確指出這種不安全的類型的轉(zhuǎn)換,已利于發(fā)現(xiàn)錯(cuò)誤。

說(shuō)了這么多C/C++,其實(shí)我是想告訴所有VB的程序員,在使用Any時(shí),我們必須和C/C++程序員使用void*一樣要高度小心?!B里沒(méi)有satic_cast這種東西,但我們可以在傳遞指針時(shí)明確的使用long類型,并且用VarPtr來(lái)取得參數(shù)的指針,這樣至少已經(jīng)明確地指出我們?cè)谑褂梦kU(xiǎn)的指針。如程序二經(jīng)過(guò)這樣的處理就成了下面的程序:

  1. '使用更安全的CopyMemory,明確的使用指針!  
  2. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)  
  3. Sub SwapStrPtr2(sA As String, sB As String)  
  4. Dim lTmp As Long  
  5. Dim pTmp As Long, psA As Long, psB As Long  
  6. pTmp = VarPtr(lTmp): psA = VarPtr(sA): psB = VarPtr(sB)  
  7. CopyMemory pTmp, psA, 4  
  8. CopyMemory psA, psB, 4  
  9. CopyMemory psB, pTmp, 4  
  10. End Sub   
責(zé)任編輯:田樹(shù) 來(lái)源: 博客
相關(guān)推薦

2009-11-10 15:30:46

VB.NET編程原則

2009-11-11 14:34:14

VB.NET動(dòng)態(tài)連接庫(kù)

2010-01-22 10:27:02

VB.NET類型提升

2009-11-10 15:36:24

VB.NET命名約定

2009-11-10 10:28:20

VB.NET誕生

2009-11-10 13:08:13

VB.NET編程技巧

2009-11-02 13:14:18

VB.NET函數(shù)

2010-01-20 17:54:13

VB.NET特殊字符

2010-01-12 16:39:26

VB.NET數(shù)據(jù)綁定

2009-10-28 09:21:19

VB.NET技術(shù)

2009-11-03 10:51:33

VB.NET共享

2009-11-03 13:48:02

VB.NET枚舉

2009-10-26 15:57:07

VB.NET使用Ora

2009-10-29 16:01:54

VB.NET資源文件

2009-10-14 17:08:44

VB.NET使用Fil

2010-01-11 16:04:10

VB.NET使用wit

2010-01-07 13:51:50

VB.NET數(shù)組賦值

2009-10-09 17:40:38

VB.Net問(wèn)題集

2009-10-23 13:40:09

VB.NET基類

2009-10-27 11:39:03

VB.NET事件處理程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)