6.Parse相關方法
在很多類型中還存在著一種針對字符串的類型轉換方法,即Parse和TryParse。這兩個方法都是靜態方法,接受的參數為字符串,將指定類 型的字符串表示形式轉換為該類型的等效值。不同的是Parse轉換失敗則拋出錯誤,而TryParse則可以通過返回的邏輯值值了解轉換是否成功。 這兩個方法的用法如下:
C#:
int i = int.Parse("123"); //正確
int j = int.Parse("123.4"); //拋出錯誤
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 Integer = Integer.Parse("123") '正確
Dim j As Integer = Integer.Parse("123.4") '拋出錯誤
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。雖然這兩個關鍵字看起來似乎一樣,但它們有所不同。
C#中的解釋:null 是引用類型變量的默認值。在C#中判斷變量是否是空值,通過expression == null或者expression != null即可,即使 expression是值類型也不會拋出錯誤,不過會有警告信息。例如下面的代碼:編譯時會提示如下警告信息:由於“int”類型的值永 不等於“int?”類型的“null”,該表達式的結果始終為“false”。
int i = 0;
Console.WriteLine(i == null); //輸出:False
i = null; //錯誤
VB.NET中的解釋:Nothing表示任意數據類型的默認值。將 Nothing 賦給變量將把該變量設置為其聲明類型的默認值。如果該類型包含變量 成員,則這些成員都會設置為其默認值。這裡的解釋和C#不一樣,可以是任何數據類型,下面的代碼中會給出驗證。VB.Net中判斷變量是否為 空值,可以用expression = Nothing,expression <> Nothing, expression Is Nothing,expression IsNot Nothing等來判斷。一般 值類型用前面兩種,引用類型用後面兩種。編寫如下代碼測試:
Dim i As Integer = 0
Console.WriteLine(i = Nothing) '輸出:True。可以看出Nothing在此表示0,是Integer的默認值。
i = 1
Console.WriteLine(i = Nothing) '輸出:False
i = Nothing
Console.WriteLine(i = Nothing) '輸出:True
Console.WriteLine(i) '輸出:0。再次驗證Nothing和0等價。
'Console.WriteLine(i Is Nothing) '報錯,Is的操作數必須是引用類型或可為null的類型。
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的默認值""。
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
'沒有為類型"SomeClass"和"SomeClass"定義運算符"="
'Console.WriteLine(c = Nothing)
Console.WriteLine(c is Nothing) '輸出:True
c = New SomeClass()
Console.WriteLine(c is Nothing) '輸出:False
以上代碼可以看出VB.NET中對Nothing的處理的特殊之處。通過SharpDevelop轉換這些VB.NET代碼成C#代碼,把所有Nothing都轉換成null了 ,VB.NET中的"="和"Is"都轉換成"==",很顯然代碼無法通過編譯。通過Reflector用C#模式查看代碼, "="和"Is"也都轉換成"==",但"i = Nothing"都轉換成"i == 0",這才是正確的代碼 。可以看出VB.Net的編譯器在背後做了一些轉換的工作。
既然VB.Net能夠把Nothing解釋為默認值,C#裡有沒有一個獲取默認值的功能呢?當然有,那就是default。用法是default(typename),比 如Console.WriteLine(default(int));這句代碼輸出0。通過Reflector查看,這句代碼被轉換成了Console.WriteLine(0);又是編譯器在背後做 了工作。