C#.NET 中的型別轉換 zt
C# 出來也有些日子了,最近由於程式設計的需要,對 C# 的型別轉換做了一些研究,其內容涉及 C# 的裝箱/拆箱/別名、數值型別間相互轉換、字元的 ASCII 碼和 Unicode 碼、數值字串和數值之間的轉換、字串和字元陣列/位元組陣列之間的轉換、各種數值型別和位元組陣列之間的轉換、十六進位制數輸出以及日期型資料的一些轉換處理 |
C# 出來也有些日子了,最近由於程式設計的需要,對 C# 的型別轉換做了一些研究,其內容涉及 C# 的裝箱/拆箱/別名、數值型別間相互轉換、字元的 ASCII 碼和 Unicode 碼、數值字串和數值之間的轉換、字串和字元陣列/位元組陣列之間的轉換、各種數值型別和位元組陣列之間的轉換、十六進位制數輸出以及日期型資料的一些轉換處理,在這裡與大家分享—— 1. 裝箱、拆箱還是別名 許多 C#.NET 的書上都有介紹 int -> Int32 是一個裝箱的過程,反之則是拆箱的過程。許多其它變數型別也是如此,如:short Int16,long Int64 等。對於一般的程式設計師來說,大可不必去了解這一過程,因為這些裝箱和拆箱的動作都是可以自動完成的,不需要寫程式碼進行干預。但是我們需要記住這些型別之間的關係,所以,我們使用“別名”來記憶它們之間的關係。
我們可以用下列程式碼做一個實驗: private void TestAlias() { // this.textBox1 是一個文字框,型別為 System.Windows.Forms.TextBox // 設計中已經將其 Multiline 屬性設定為 true byte a = 1; char b = 'a'; short c = 1; int d = 2; long e = 3; uint f = 4; bool g = true; this.textBox1.Text = ""; this.textBox1.AppendText("byte -> " + a.GetType().FullName + "n"); this.textBox1.AppendText("char -> " + b.GetType().FullName + "n"); this.textBox1.AppendText("short -> " + c.GetType().FullName + "n"); this.textBox1.AppendText("int -> " + d.GetType().FullName + "n"); this.textBox1.AppendText("long -> " + e.GetType().FullName + "n"); this.textBox1.AppendText("uint -> " + f.GetType().FullName + "n"); this.textBox1.AppendText("bool -> " + g.GetType().FullName + "n"); } 在窗體中新建一個按鈕,並在它的單擊事件中呼叫該 TestAlias() 函式,我們將看到執行結果如下:
這足以說明各別名對應的類! 2. 數值型別之間的相互轉換 這裡所說的數值型別包括 byte, short, int, long, fload, double 等,根據這個排列順序,各種型別的值依次可以向後自動進行轉換。舉個例來說,把一個 short 型的資料賦值給一個 int 型的變數,short 值會自動行轉換成 int 型值,再賦給 int 型變數。如下例: private void TestBasic() { byte a = 1; short b = a; int c = b; long d = c; float e = d; double f = e; this.textBox1.Text = ""; this.textBox1.AppendText("byte a = " + a.ToString() + "n"); this.textBox1.AppendText("short b = " + b.ToString() + "n"); this.textBox1.AppendText("int c = " + c.ToString() + "n"); this.textBox1.AppendText("long d = " + d.ToString() + "n"); this.textBox1.AppendText("float e = " + e.ToString() + "n"); this.textBox1.AppendText("double f = " + f.ToString() + "n"); } 譯順利透過,執行結果是各變數的值均為 1;當然,它們的型別分別還是 System.Byte 型……System.Double 型。現在我們來試試,如果把賦值的順序反過來會怎麼樣呢?在 TestBasic() 函式中追加如下語句:
結果編譯報錯: 這個時候,如果我們堅持要進行轉換,就應該使用強制型別轉換,這在 C 語言中常有提及,就是使用“(型別名) 變數名”形式的語句來對資料進行強制轉換。如上例修改如下:
編譯透過,執行結果輸出了 h = 1,轉換成功。
編譯沒有出錯,執行結果卻不是 h = 265,而是 h = 9。 3. 字元的 ASCII 碼和 Unicode 碼 很多時候我們需要得到一個英文字元的 ASCII 碼,或者一個漢字字元的 Unicode 碼,或者從相關的編碼查詢它是哪一個字元的編碼。很多人,尤其是從 VB 程式序轉過來學 C# 的人,會報怨 C# 裡為什麼沒有提供現成的函式來做這個事情——因為在 VB 中有 Asc() 函式和 Chr() 函式用於這類轉換。 private void TestChar() { char ch = 'a'; short ii = 65; this.textBox1.Text = ""; this.textBox1.AppendText("The ASCII code of '" + ch + "' is: " + (short) ch + "n"); this.textBox1.AppendText("ASCII is " + ii.ToString() + ", the char is: " + (char) ii + "n"); char cn = '中'; short uc = 22478; this.textBox1.AppendText("The Unicode of '" + cn + "' is: " + (short) cn + "n"); this.textBox1.AppendText("Unicode is " + uc.ToString() + ", the char is: " + (char) uc + "n"); } 它的執行結果是
從這個例子中,我們便能非常清楚的瞭解——透過強制轉換,可以得以字元的編碼,或者得到編碼表示的字元。如果你需要的不是 short 型的編碼,請參考第 1 條進行轉換,即可得到 int 等型別的編碼值。 4. 數值字串和數值之間的轉換 首先,我們得搞明白,什麼是數值字串。我們知道,在 C# 中,字串是用一對雙引號包含的若干字元來表示的,如 "123"。而 "123" 又相對特殊,因為組成該字串的字元都是數字,這樣的字串,就是數值字串。在我們的眼中,這即是一串字元,也是一個數,但計算機卻只認為它是一個字串,不是數。因此,我們在某些時候,比如輸入數值的時候,把字串轉換成數值;而在另一些時候,我們需要相反的轉換。 private void TestStringValue() { float f = 54.321F; string str = "123"; this.textBox1.Text = ""; this.textBox1.AppendText("f = " + f.ToString() + "n"); if (int.Parse(str) == 123) { this.textBox1.AppendText("str convert to int successfully."); } else { this.textBox1.AppendText("str convert to int failed."); } } 執行結果:
5. 字串和字元陣列之間的轉換 字串類 System.String 提供了一個 void ToCharArray() 方法,該方法可以實現字串到字元陣列的轉換。如下例: private void TestStringChars() { string str = "mytest"; char[] chars = str.ToCharArray(); this.textBox1.Text = ""; this.textBox1.AppendText("Length of "mytest" is " + str.Length + "n"); this.textBox1.AppendText("Length of char array is " + chars.Length + "n"); this.textBox1.AppendText("char[2] = " + chars[2] + "n"); } 例中以對轉換轉換到的字元陣列長度和它的一個元素進行了測試,結果如下:
可以看出,結果完全正確,這說明轉換成功。那麼反過來,要把字元陣列轉換成字串又該如何呢?
執行結果輸入 tstr = "test me",測試說明轉換成功。
正確的輸出是 "test me"[3] = t,經測試,輸出正確。 6. 字串和位元組陣列之間的轉換 如果還想從 System.String 類中找到方法進行字串和位元組陣列之間的轉換,恐怕你會失望了。為了進行這樣的轉換,我們不得不借助另一個類:System.Text.Encoding。該類提供了 bye[] GetBytes(string) 方法將字串轉換成位元組陣列,還提供了 string GetString(byte[]) 方法將位元組陣列轉換成字串。 private void TestStringBytes() { string s = "C#語言"; byte[] b1 = System.Text.Encoding.Default.GetBytes(s); byte[] b2 = System.Text.Encoding.Unicode.GetBytes(s); string t1 = "", t2 = ""; foreach (byte b in b1) { t1 += b.ToString("") + " "; } foreach (byte b in b2) { t2 += b.ToString("") + " "; } this.textBox1.Text = ""; this.textBox1.AppendText("b1.Length = " + b1.Length + "n"); this.textBox1.AppendText(t1 + "n"); this.textBox1.AppendText("b2.Length = " + b2.Length + "n"); this.textBox1.AppendText(t2 + "n"); } 執行結果如下,不說詳述,相信大家已經明白了。
將位元組陣列轉換成字串,使用 Encoding 類的 string GetString(byte[]) 或 string GetString(byte[], int, int) 方法,具體使用何種 Encoding 還是由編碼決定。在 TestStringBytes() 函式中新增如下語句作為例項:
執行結果為:The string is: abcdef 7. 各種數值型別和位元組陣列之間的轉換 在第 1 條中我們可以查到各種數值型需要使用多少位元組的空間來儲存資料。將某種數值型別的資料轉換成位元組陣列的時候,得到的一定是相應大小的位元組陣列;同樣,需要把位元組陣列轉換成數值型別,也需要這個位元組陣列大於相應數值型別的位元組數。 由於這類轉換通常只是在需要進行較細微的編碼/解碼操作時才會用到,所以這裡就不詳細敘述了,僅把 System.BitConverter 類介紹給大家。 8. 轉換成十六進位制 任何資料在計算機內部都是以二進位制儲存的,所以進位制與資料的儲存無關,只與輸入輸出有關。所以,對於進位制轉換,我們只關心字串中的結果。 private void TestHex() { int a = 188; this.textBox1.Text = ""; this.textBox1.AppendText("a(10) = " + a.ToString() + "n"); this.textBox1.AppendText("a(16) = " + a.ToString("x") + "n"); this.textBox1.AppendText("a(16) = " + a.ToString("X") + "n"); } 執行結果如下:
這時候,我們可能有另一種需求,即為了顯示結果的整齊,我們需要控制十六進位制表示的長度,如果長度不夠,用前導的 0 填補。解決這個問題,我們只需要在格式說明符“x”或者“X”後寫上表示長度的數字就行了。比如,要限制在 4 個字元的長度,可以寫成“X4”。在上例中追加一句:
其結果將輸出 a(16) = 00BC。 9. 日期型資料和長整型資料之間的轉換 為什麼要將日期型資料轉換為長整型資料呢?原因很多,但就我個人來說,經常將它用於資料庫的日期儲存。由於各種資料庫對日期型的定義和處理是不一樣的,各種語言對日期型資料的定義的處理也各不相同,因為,我寧願將日期型資料轉換成長整型再儲存到資料庫中。雖然也可以使用字串來儲存,但使用字串也會涉及到許多問題,如區域等問題,而且,它需要比儲存長整型資料更多的空間。
DateTime 的建構函式中也提供了相應的,從長整型資料構造 DateTime 型資料的函式:DateTime(long)。如:
但這樣對於很多 VB6 程式設計師來說,是給他們出了一道難題,因為 VB6 中的日期型資料內部是以 Double 型表示的,將其轉換為長整型後得到的僅僅是日期,而沒有時間。如何協調這兩種日期型別呢? private void TestDateTimeLong() { double doubleDate = DateTime.Now.ToOADate(); DateTime theDate = DateTime.FromOADate(doubleDate); this.textBox1.Text = ""; this.textBox1.AppendText("Double value of now: " + doubleDate.ToString() + "n"); this.textBox1.AppendText("DateTime from double value: " + theDate.ToString() + "n"); } 執行結果:
10. 格式化日期型資料 程式設計的過程中,通常需要將日期型資料按照一定的格式輸出,當然,輸出結果肯定是字串。為此,我們需要使用 System.DateTime 類的 ToString() 方法,併為其指定格式字串。
為了便於大家的理解,不妨試試下面的程式: private void TestDateTimeToString() { DateTime now = DateTime.Now; string format; this.textBox1.Text = ""; format = "yyyy-MM-dd HH:mm:ss"; this.textBox1.AppendText(format + ": " + now.ToString(format) + "n"); format = "yy年M日d日"; this.textBox1.AppendText(format + ": " + now.ToString(format) + "n"); } 這段程式將輸出結果:
這時候,又出現一個問題,如果要輸出的文字資訊中包含格式字元怎麼辦?如
將輸出:
這並不是我想要的結果,怎麼辦呢?有辦法——
看,這次執行結果對了:
可以看出,只需要使用單引號或者雙引號將文字資訊括起來就好。 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82387/viewspace-903665/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【邊城狂人】C#.NET 中的型別轉換C#型別
- C++中的向上型別轉換和向下型別轉換C++型別
- java中的型別轉換Java型別
- python中的型別轉換Python型別
- 瞭解JavaScript中的型別轉換JavaScript型別
- JavaScript中的強制型別轉換JavaScript型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- PHP 型別轉換&&型別強制轉換PHP型別
- (譯)js中的神奇的型別轉換JS型別
- java型別轉換與強制型別轉換(轉)Java型別
- javascript中隱私型別轉換JavaScript型別
- JS在if中的強制型別轉換JS型別
- C++ 表示式中的型別轉換C++型別
- 型別轉換型別
- interface{} 型別的轉換型別
- golang的型別轉換Golang型別
- ABAP中Char型別資料轉換成Decimal型別型別Decimal
- 資料型別,型別轉換資料型別
- golang 中的四種型別轉換總結Golang型別
- ASP中容易出錯的Null型別轉換Null型別
- Java中基本型別Array與複合型別List的互相轉換Java型別
- 日期型別與String型別的轉換型別
- js型別轉換JS型別
- 字元型別轉換字元型別
- 3.2 型別轉換型別
- JavaScript 型別轉換JavaScript型別
- Golang型別轉換Golang型別
- 型別轉換(cast)型別AST
- C# 泛型中的資料型別判定與轉換C#泛型資料型別
- 資料型別的轉換資料型別
- oracle中date資料型別與timestamp資料型別的轉換Oracle資料型別
- C++ 中四種強制型別轉換的區別C++型別
- C#.Net築基-型別系統②常見型別C#型別
- 從Java的型別轉換看MySQL和Oracle中的隱式轉換(二)Java型別MySqlOracle
- 聊聊 C++ 中的四種型別轉換符C++型別
- Python OpenCV中色彩空間的轉換型別PythonOpenCV型別
- ORACLE中的隱式資料型別轉換(一)Oracle資料型別
- Java資料型別及型別轉換Java資料型別