天天看點

.NET中的資料類型的一些變化

  今天在做一個關于IC卡讀寫的程式,用到了一個IC卡讀寫器,有一個配套的dll動态庫和一些庫函數的說明,但是調試的時候總是會遇到一些奇怪的現象。VB6的示例中可以的操作,在我的程式中就會出現“未将對象引用設定到對象的執行個體”等等錯誤。折騰了半天也沒有什麼進展。後來用.NET的更新向導将那個VB6的實力程式更新,發現子產品中函數的聲明有一些變化。

VB6 中聲明:

Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Long, ByVal page As Integer, ByVal offset As Integer, ByVal le As Long, ByVal data_buffer$) As Integer

更新後.NET 的聲明:

Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Integer, ByVal page As Short, ByVal offset As Short, ByVal le As Integer, ByVal data_buffer As String) As Short

  VB6中Long類型在.NET中變成了Integer,而Integer變成了Short。就這麼一點小小的問題搞得我郁悶了半天。把程式調試通過以後,我查了一下MSDN Library,發現.NET的資料類型和VB6的存在一些變化。具體的可以看下面這兩張表。

表1  VB6中的資料類型

資料類型 存儲空間大小 範圍
Byte 1 個位元組 0 到 255
Boolean 2 個位元組 True False
Integer 2 個位元組 -32,768 到 32,767
Long (長整型) 4 個位元組 -2,147,483,648 到 2,147,483,647
Single (單精度浮點型) 4 個位元組 負數時從 -3.402823E38 到 -1.401298E-45;正數時從 1.401298E-45 到 3.402823E38
Double (雙精度浮點型) 8 個位元組

負數時從 -1.79769313486232E308 到

-4.94065645841247E-324;正數時從4.94065645841247E-324 到 1.79769313486232E308

Currency (變比整型) 8 個位元組 從 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
Decimal 14 個位元組 沒有小數點時為 +/-79,228,162,514,264,337,593,543,950,335,而小數點右邊有 28 位數時為 +/-7.9228162514264337593543950335;最小的非零值為 +/-0.0000000000000000000000000001
Date 8 個位元組 100 年 1 月 1 日 到 9999 年 12 月 31 日
Object 4 個位元組 任何 Object 引用
String (變長) 10 位元組加字元串長度 0 到大約 20 億
String (定長) 字元串長度 1 到大約 65,400
Variant (數字) 16 個位元組 任何數字值,最大可達 Double 的範圍
Variant (字元) 22 個位元組加字元串長度 與變長 String 有相同的範圍

使用者自定義

(利用

Type
所有元素所需數目 每個元素的範圍與它本身的資料類型的範圍相同。

表2  VB.NET中的資料類型

Visual Basic 類型 公共語言運作庫類型結構 名義存儲配置設定 取值範圍
Boolean System.Boolean 2 個位元組 True False
Byte System.Byte 1 個位元組 0 到 255(無符号)。
Char System.Char 2 個位元組 0 到 65535(無符号)。
Date System.DateTime 8 個位元組 0001 年 1 月 1 日淩晨 0:00:00 到 9999 年 12 月 31 日晚上 11:59:59。
Decimal System.Decimal 16 個位元組

0 到 +/-79,228,162,514,264,337,593,543,950,335 之間不帶小數點的數;

0 到 +/-7.9228162514264337593543950335 之間帶 28 位小數的數;最小非零數為

+/-0.0000000000000000000000000001 (+/-1E-28)。

Double (雙精度浮點型) System.Double 8 個位元組 負值取值範圍為 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值範圍為 4.94065645841246544E-324 到 1.79769313486231570E+308。
Integer System.Int32 4 個位元組 -2,147,483,648 到 2,147,483,647。
Long (長整型) System.Int64 8 個位元組 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
Short System.Int16 2 個位元組 -32,768 到 32,767。
Object System.Object (類) 4 個位元組 任何類型都可以存儲在 Object 類型的變量中。
Single (單精度浮點型) System.Single 4 個位元組 負值取值範圍為 -3.4028235E+38 到 -1.401298E-45;正值取值範圍為 1.401298E-45 到 3.4028235E+38。
String (變長) System.String (類) 取決于實作平台 0 到大約 20 億個 Unicode 字元。
使用者定義的類型 (結構) (從 System.ValueType 繼承) 取決于實作平台 結構中的每個成員都有由自身資料類型決定的取值範圍,并與其他成員的取值範圍無關。

從兩張表中可以清楚地看到VB6中的Integer類型是2個位元組長度的,Long是4個位元組長度的。在.NET中Interger變成了4個位元組,Long是8個位元組。多了一個Short類型,是2個位元組的。

資料類型的字長不一樣導緻了調用庫函數時資料類型轉化的沖突,是以也就出現了很多奇怪的問題,不過現在問題順利解決,希望這些經驗能對.NET的初學者有一些幫助。