溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用VB.NET中的ANY

發(fā)布時(shí)間:2021-11-03 15:03:44 來源:億速云 閱讀:498 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)如何使用VB.NET中的ANY,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

我們?cè)谑褂弥羔樀臅r(shí)候會(huì)運(yùn)到很多問題,不知道你們?cè)诰幊讨杏龅竭^沒有,這里把我也前遇到的問題分享給大家一些。Any不是一個(gè)真正的類型,它只是告訴VB編譯器放棄對(duì)參數(shù)類型的檢查,這樣,理論上,我們可以將任何類型傳遞給API。Any在什么地方用呢?讓我們來看看,在VB文檔里的是怎么說的,現(xiàn)在就請(qǐng)打開MSDN(Visual Studio 6自帶的版本),翻到"Visual Basic文檔"->"使用Visual Basic"->"部件工具指南"->"訪問DLL和Windows API"部分,再看看"將 C 語言聲明轉(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)然,也可以如我所說,永遠(yuǎn)不要用VB.NET ANY。

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

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

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

因memcpy前兩個(gè)參數(shù)用的是void*,因此任何類型的參數(shù)都可以傳遞給他。一個(gè)用C的程序員,應(yīng)該知道在C函數(shù)庫(kù)里這樣的void*并不少見,也應(yīng)該知道它有多危險(xiǎn)。無論傳遞什么類型的變量指針給上面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來明確指出這種不安全的類型的轉(zhuǎn)換,已利于發(fā)現(xiàn)錯(cuò)誤。

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

'使用更安全的CopyMemory,明確的使用指針!  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)  Sub SwapStrPtr2(sA As String, sB As String)  Dim lTmp As Long  Dim pTmp As Long, psA As Long, psB As Long  pTmp = VarPtr(lTmp): psA = VarPtr(sA): psB = VarPtr(sB)  CopyMemory pTmp, psA, 4  CopyMemory psA, psB, 4  CopyMemory psB, pTmp, 4  End Sub

關(guān)于“如何使用VB.NET中的ANY”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI