新聞中心
1.GetType

創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比靖宇網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式靖宇網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋靖宇地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
(1)Object.GetType()
該方法是所有對(duì)象都有的方法,MSDN中的解釋是“獲取當(dāng)前實(shí)例的 Type。”。該方法的返回值是System.Type類(lèi)型的實(shí)例,表示當(dāng)前實(shí)例的確切運(yùn)行時(shí)類(lèi)型。
例如:
- C#:
- int number = 3;
- System.Type t = number.GetType();
- Console.WriteLine(t.FullName); //輸出:System.Int32
- VB.NET:
- Dim number as Integer = 3
- Dim t As System.Type = number.GetType()
- Console.WriteLine(t.FullName) '輸出:System.Int32
(2)VB.NET類(lèi)型中的GetType方法
參考MSDN中的解釋?zhuān)悍祷刂付?lèi)型的 Type 對(duì)象。Type 對(duì)象提供有關(guān)類(lèi)型的信息,如類(lèi)型的屬性、方法和事件。
用法:GetType(typename),其中typename是需要獲取其信息的類(lèi)型的名稱。
例如:
- Dim t As System.Type = GetType(Integer)
- Console.WriteLine(t.FullName) '輸出:System.Int32
(3)Type.GetType系列方法
System.Type類(lèi)型中的GetType方法一共有4個(gè),其中不帶參數(shù)的GetType()是繼承自O(shè)bject的實(shí)例方法,其他三個(gè)是靜態(tài)方法(C#中為static,VB.NET中為Shared)。實(shí)例方法不用介紹了,就是Object.GetType()。靜態(tài)方法是通過(guò)類(lèi)型名稱的字符串獲取System.Type。MSDN中的解釋有一大篇,這里只給出簡(jiǎn)單示例:
- C#:
- System.Type t = Type.GetType("System.Int32");
- Console.WriteLine(t.FullName); //輸出:System.Int32
- VB.NET
- Dim t As System.Type = Type.GetType("System.Int32");
- Console.WriteLine(t.FullName) '輸出:System.Int32
注意這里的類(lèi)型名稱必須是包含命名空間的全名,即System.Type的FullName,不能是C#或者VB.NET中的類(lèi)型名稱,如C#中的"int"或者VB.NET中的"Integer"
2.typeof
在C#和VB.NET類(lèi)型中都有typeof關(guān)鍵字,但它們的用法卻不一樣。
C#中typeof相當(dāng)于VB.NET中的GetType,用于獲取指定類(lèi)型的 Type 對(duì)象。
用法
- System.Type t = typeof(int);
- Console.WriteLine(t.FullName); //輸出:System.Int32
VB.NET類(lèi)型中的TypeOf則總是與Is關(guān)鍵字一起用于構(gòu)造TypeOf…Is表達(dá)式。MSDN中對(duì)該關(guān)鍵字的解釋是:比較對(duì)象引用變量與數(shù)據(jù)類(lèi)型。需要注意的是該表達(dá)式只能針對(duì)引用類(lèi)型,如果把下面的示例中的i聲明為Integer則會(huì)出錯(cuò)。
VB.NET用法:
- Dim i As Object = 2
- Console.WriteLine(TypeOf i Is Integer) '輸出:True
- Console.WriteLine(Typeof i Is Double) '輸出:False
3.is
在C#和VB.NET類(lèi)型中也都存在is關(guān)鍵字,當(dāng)然它們的用法也不一樣。
C#中is 的作用是:檢查對(duì)象是否與給定類(lèi)型兼容。它執(zhí)行的是類(lèi)型比較。MSDN中的備注:如果所提供的表達(dá)式非空,并且所提供的對(duì)象可以強(qiáng)制轉(zhuǎn)換為所提供的類(lèi)型而不會(huì)導(dǎo)致引發(fā)異常,則 is 表達(dá)式的計(jì)算結(jié)果將是 true。請(qǐng)注意,is 運(yùn)算符只考慮引用轉(zhuǎn)換、裝箱轉(zhuǎn)換和取消裝箱轉(zhuǎn)換。不考慮其他轉(zhuǎn)換,如用戶定義的轉(zhuǎn)換。
可以認(rèn)為C#中的is 相當(dāng)于VB.NET中的TypeOf…Is。
用法:
- int i = 2;
- Console.WriteLine(i is int); //輸出:True
- Console.WriteLine(i is double); //輸出:False
VB.NET中Is 的作用是:比較兩個(gè)對(duì)象引用變量。MSDN中的備注:Is 運(yùn)算符確定兩個(gè)對(duì)象引用是否引用同一個(gè)對(duì)象。但是,它不執(zhí)行值比較。如果 object1 和 object2 引用同一個(gè)對(duì)象實(shí)例,則 result 為 True;如果它們不引用同一個(gè)對(duì)象,則 result 為 False。該運(yùn)算符和TypeOf…Is一樣,也只適用于引用類(lèi)型。
用法:
- Dim i As String = "Hello"
- Dim j AS String = "Hello"
- Dim k as String = "Hello world"
- Console.WriteLine(i Is j) '輸出:True
- Console.WriteLine(i Is k) '輸出:False
- k = j
- Console.WriteLine(i Is k) '輸出:True
4.as
同樣C#和VB.NET類(lèi)型里面都存在as,用法也不一樣。
C#中as 的作用是:as 運(yùn)算符用于在兼容的引用類(lèi)型之間執(zhí)行轉(zhuǎn)換。as 運(yùn)算符類(lèi)似于強(qiáng)制轉(zhuǎn)換操作。但是,如果無(wú)法進(jìn)行轉(zhuǎn)換,則 as 返回 null 而非引發(fā)異常。
expression as type 等效于 expression is type ? (type)expression : (type)null
用法:
- string s = someObject as string;
- If(s != null)
- Console.WriteLine("someObject is a string");
VB.NET中As 的作用是:引入 As 子句,該子句標(biāo)識(shí)聲明語(yǔ)句中的數(shù)據(jù)類(lèi)型或泛型類(lèi)型參數(shù)中的約束列表。
在VB.NET中這個(gè)關(guān)鍵字太常見(jiàn)了,就不需要過(guò)多解釋。
用法:
- Private i As Integer = 3 '聲明字段
- Dim j As String = "hello" '聲明變量
- Sub Test(ByVal k As Boolean) '聲明參數(shù)
- Public Class MyClass(Of T As {IComparable, IDisposable, Class, New}) '泛型類(lèi)型約束
5.類(lèi)型轉(zhuǎn)換
類(lèi)型轉(zhuǎn)換是在編程過(guò)程中經(jīng)常會(huì)遇到的。在這兩種語(yǔ)言中,有共同的方法,也有各自特有的方法。
共同的方法是Convert類(lèi)的使用,因?yàn)镃onvert類(lèi)是System命名空間中的。該類(lèi)中包含了各種常見(jiàn)類(lèi)型的轉(zhuǎn)換方法,比如ToInt32, ToSingle, ToBoolean等,這些方法的返回值就是需要的類(lèi)型,不需要經(jīng)過(guò)轉(zhuǎn)換。Convert類(lèi)中通用的類(lèi)型轉(zhuǎn)換方法是ChangeType,該方法返回具有指定類(lèi)型而且其值等效于指定對(duì)象的Object,這時(shí)候就需要對(duì)返回值進(jìn)行顯示轉(zhuǎn)換了。
- C#:
- double d = 1.234
- int i = (int)Convert.ChangeType(d,typeof(int));
- VB.NET:
- Dim d As Double = 1.234
- Dim i As Integer = CInt(Convert.ChangeType(d,GetType(Integer)))
關(guān)于顯式轉(zhuǎn)換
C#中的顯式轉(zhuǎn)換的格式是(type)expression
用法:
- double d = 1.234
- int i = (int)d;
VB.NET中顯式轉(zhuǎn)換的格式是CType(expression,type)。MSDN中關(guān)于CType的解釋?zhuān)篊Type 是一個(gè)“內(nèi)聯(lián)函數(shù)”,這意味著轉(zhuǎn)換是由已編譯的代碼執(zhí)行的,通常不會(huì)生成函數(shù)調(diào)用。這將提高性能。
用法:
- Dim d As Double = 1.234
- Dim i As Integer = CType(d, Integer)
VB.NET中還有一系列函數(shù)與CType函數(shù)同屬于Conversion函數(shù),例如CBool, CInt, CString, Hex, Format, Val等等,這些函數(shù)都是內(nèi)聯(lián)函數(shù),具體的用法可以參考MSDN。
另外在VB.NET中還包含兩個(gè)特殊的轉(zhuǎn)換方法,DirectCast和TryCast。這兩個(gè)方法和CType的用法一樣,它們的區(qū)別見(jiàn)下表。
|
關(guān)鍵字 |
數(shù)據(jù)類(lèi)型 |
參數(shù)關(guān)系 |
|
CType |
任何數(shù)據(jù)類(lèi)型 |
必須在兩種數(shù)據(jù)類(lèi)型之間定義擴(kuò)大轉(zhuǎn)換或收縮轉(zhuǎn)換 |
|
DirectCast |
任何數(shù)據(jù)類(lèi)型 |
一個(gè)類(lèi)型必須繼承或者實(shí)現(xiàn)另一個(gè)類(lèi)型 |
|
TryCast |
僅引用類(lèi)型 |
一個(gè)類(lèi)型必須繼承或者實(shí)現(xiàn)另一個(gè)類(lèi)型 |
從上表可以看出,VB.NET的TryCast和C#的as作用是一樣的。
DirectCast示例(摘自MSDN):
- Dim q As Object = 2.37
- Dim i As Integer = CType(q, Integer)
- ' The following conversion fails at run time
- Dim j As Integer = DirectCast(q, Integer)
- Dim f As New System.Windows.Forms.Form
- Dim c As System.Windows.Forms.Control
- ' The following conversion succeeds.
- c = DirectCast(f, System.Windows.Forms.Control)
TryCast示例(摘自MSDN):
- Function PrintTypeCode(ByVal obj As Object) As String
- Dim objAsConvertible As IConvertible = TryCast(obj, IConvertible)
- If objAsConvertible Is Nothing Then
- Return obj.ToString() & " does not implement IConvertible"
- Else
- Return "Type code is " & objAsConvertible.GetTypeCode()
- End If
- End Function
6.Parse相關(guān)方法
在很多類(lèi)型中還存在著一種針對(duì)字符串的類(lèi)型轉(zhuǎn)換方法,即Parse和TryParse。這兩個(gè)方法都是靜態(tài)方法,接受的參數(shù)為字符串,將指定類(lèi)型的字符串表示形式轉(zhuǎn)換為該類(lèi)型的等效值。不同的是Parse轉(zhuǎn)換失敗則拋出錯(cuò)誤,而TryParse則可以通過(guò)返回的邏輯值值了解轉(zhuǎn)換是否成功。這兩個(gè)方法的用法如下:
- C#:
- int i = int.Parse("123"); //正確
- int j = int.Parse("123.4"); //拋出錯(cuò)誤
- int k = 0;
- //下面輸出:False_0
- Console.WriteLine(int.TryParse("456.7", out k).ToString() + "_" + k.ToString());
- //下面輸出:True_789
- Console.WriteLine(int.TryParse("789", out k).ToString() + "_" + k.ToString());
- VB.NET:
- Dim i As IntegerInteger = Integer.Parse("123") '正確
- Dim j As IntegerInteger = Integer.Parse("123.4") '拋出錯(cuò)誤
- Dim k As Integer = 0
- '下面輸出:False_0
- Console.WriteLine(Integer.TryParse("456.7", k).ToString() & "_" & k.ToString())
- '下面輸出:True_789
- Console.WriteLine(Integer.TryParse("789", k).ToString() & "_" & k.ToString())
7.空值的比較
空值在C#中為null,在VB.NET中為Nothing。雖然這兩個(gè)關(guān)鍵字看起來(lái)似乎一樣,但它們有所不同。
C#中的解釋?zhuān)簄ull 是引用類(lèi)型變量的默認(rèn)值。在C#中判斷變量是否是空值,通過(guò)expression == null或者expression != null即可,即使expression是值類(lèi)型也不會(huì)拋出錯(cuò)誤,不過(guò)會(huì)有警告信息。例如下面的代碼:編譯時(shí)會(huì)提示如下警告信息:由于“int”類(lèi)型的值永不等于“int?”類(lèi)型的“null”,該表達(dá)式的結(jié)果始終為“false”。
- int i = 0;
- Console.WriteLine(i == null); //輸出:False
- i = null; //錯(cuò)誤
VB.NET中的解釋?zhuān)篘othing表示任意數(shù)據(jù)類(lèi)型的默認(rèn)值。將 Nothing 賦給變量將把該變量設(shè)置為其聲明類(lèi)型的默認(rèn)值。如果該類(lèi)型包含變量成員,則這些成員都會(huì)設(shè)置為其默認(rèn)值。這里的解釋和C#不一樣,可以是任何數(shù)據(jù)類(lèi)型,下面的代碼中會(huì)給出驗(yàn)證。VB.NET中判斷變量是否為空值,可以用expression = Nothing,expression <> Nothing, expression Is Nothing,expression IsNot Nothing等來(lái)判斷。一般值類(lèi)型用前面兩種,引用類(lèi)型用后面兩種。編寫(xiě)如下代碼測(cè)試:
- Dim i As Integer = 0
- Console.WriteLine(i = Nothing) '輸出:True??梢钥闯鯪othing在此表示0,是Integer的默認(rèn)值。
- i = 1
- Console.WriteLine(i = Nothing) '輸出:False
- i = Nothing
- Console.WriteLine(i = Nothing) '輸出:True
- Console.WriteLine(i) '輸出:0。再次驗(yàn)證Nothing和0等價(jià)。
- 'Console.WriteLine(i Is Nothing) '報(bào)錯(cuò),Is的操作數(shù)必須是引用類(lèi)型或可為null的類(lèi)型。
- Dim s As String
- Console.WriteLine(s & "abc") '輸出:abc
- Console.WriteLine(String.IsNullOrEmpty(s)) '輸出:True
- Console.WriteLine(s = Nothing) '輸出:True
- Console.WriteLine(s Is Nothing) '輸出:True。
- s = ""
- Console.WriteLine(String.IsNullOrEmpty(s)) '輸出:True
- Console.WriteLine(s = Nothing) '輸出:True。Nothing表示String的默認(rèn)值""。
- Console.WriteLine(s Is Nothing) '輸出:False。
- s = Nothing
- Console.WriteLine(String.IsNullOrEmpty(s)) '輸出:True
- Console.WriteLine(s = Nothing) '輸出:True
- Console.WriteLine(s Is Nothing) '輸出:True
- Dim c As SomeClass
- '沒(méi)有為類(lèi)型"SomeClass"和"SomeClass"定義運(yùn)算符"="
- 'Console.WriteLine(c = Nothing)
- Console.WriteLine(c is Nothing) '輸出:True
- c = New SomeClass()
- Console.WriteLine(c is Nothing) '輸出:False
以上代碼可以看出VB.NET中對(duì)Nothing的處理的特殊之處。通過(guò)SharpDevelop轉(zhuǎn)換這些VB.NET代碼成C#代碼,把所有Nothing都轉(zhuǎn)換成null了,VB.NET中的"="和"Is"都轉(zhuǎn)換成"==",很顯然代碼無(wú)法通過(guò)編譯。通過(guò)Reflector用C#模式查看代碼,"="和"Is"也都轉(zhuǎn)換成"==",但"i = Nothing"都轉(zhuǎn)換成"i == 0",這才是正確的代碼??梢钥闯鯲B.NET的編譯器在背后做了一些轉(zhuǎn)換的工作。
既然VB.NET能夠把Nothing解釋為默認(rèn)值,C#里有沒(méi)有一個(gè)獲取默認(rèn)值的功能呢?當(dāng)然有,那就是default。用法是default(typename),比如Console.WriteLine(default(int));這句代碼輸出0。通過(guò)Reflector查看,這句代碼被轉(zhuǎn)換成了Console.WriteLine(0);又是編譯器在背后做了工作。
8.可空類(lèi)型
首先看一下可空類(lèi)型的說(shuō)明:表示基礎(chǔ)類(lèi)型為值類(lèi)型的對(duì)象,值類(lèi)型與引用類(lèi)型一樣也可以分配 null 引用(在 Visual Basic 中為 Nothing)。
某些值類(lèi)型并不總是具有(或需要)已定義的值。在可能沒(méi)有為某些字段賦予任何值的數(shù)據(jù)庫(kù)中,這是常見(jiàn)的實(shí)際情況。例如,您可以將 null 值賦予數(shù)據(jù)庫(kù)字段以表示尚未給該數(shù)據(jù)庫(kù)字段賦值。通過(guò)可空類(lèi)型,可以向一個(gè)類(lèi)型的默認(rèn)值范圍中再添加一個(gè)為空的值。
可空類(lèi)型在系統(tǒng)中有一個(gè)專(zhuān)門(mén)的類(lèi)型,Nullable,一般使用泛型可空類(lèi)型,C#為Nullable ,VB.NET為Nullable(Of T)。除了采用類(lèi)名稱來(lái)定義外,在這兩種語(yǔ)言中都有簡(jiǎn)寫(xiě)形式的定義,下面代碼中的定義是等價(jià)的:
- C#:
- Nullable
i = null; - int? j = null;
- VB.NET:
- Dim i As Nullable(Of Integer) = Nothing
- Dim j? As Integer = Nothing 'VS2005不支持這種寫(xiě)法
定義為可空類(lèi)型的變量,可以和原始類(lèi)型的變量一起進(jìn)行運(yùn)算,比如i+j,但是需要判斷該變量是否有值,否則可能出錯(cuò)。判斷可空類(lèi)型的變量是否有值,可以通過(guò)HasValue屬性來(lái)判斷,然后通過(guò)Value屬性來(lái)獲取值??煽疹?lèi)型還有一個(gè)方法,GetValueOrDefault,如果有值,則獲取Value,如果為空,則獲取基礎(chǔ)類(lèi)型的默認(rèn)值。詳細(xì)用法請(qǐng)參考MSDN。
另外在C#中還有一個(gè)特殊的運(yùn)算符??,該運(yùn)算符的用法為j = i ?? 5;意思是如果i不為空,則返回i的值,否則返回5。查看MSDN中的解釋?zhuān)喝绻??? 運(yùn)算符的左操作數(shù)非 null,該運(yùn)算符將返回左操作數(shù),否則返回右操作數(shù)。通過(guò)該運(yùn)算符可以簡(jiǎn)化判斷取值的方法。
9.空數(shù)據(jù)類(lèi)型
在系統(tǒng)還存在一種特殊的類(lèi)型,DBNull。在操作數(shù)據(jù)庫(kù)的時(shí)候,獲取的數(shù)據(jù)項(xiàng)沒(méi)有值,這個(gè)數(shù)據(jù)項(xiàng)可能不是null(Nothing),而是DBNull。下面驗(yàn)證這兩個(gè)值的不同:
- C#:
- Console.WriteLine(DBNull.Value == Nothing); //輸出:False
- VB.NET:
- Console.WriteLine(DBNull.Value Is Nothing) ' 輸出:False
在使用DBNull的時(shí)候必須使用DBNull.Value,如下:
- C#:
- object item = row[0];
- Console.WriteLine(item != DBNull.Value);
- VB.NET:
- Dim item As Object = row(0)
- Console.WriteLine(item = DBNull.Value)
本文就寫(xiě)到這里了,希望對(duì)初學(xué)者有所幫助。因?yàn)榇a比較簡(jiǎn)單,其中的變量使用了簡(jiǎn)單的字母命名。文中有什么不足之處,還請(qǐng)大家指正。
文章標(biāo)題:C#和VB.NET類(lèi)型相關(guān)知識(shí)匯總
鏈接分享:http://m.fisionsoft.com.cn/article/dhchpis.html


咨詢
建站咨詢
