C#系列圖文說明教程 [3]
發(fā)表時間:2024-01-23 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本教程參考C#和ASP.NET程序設(shè)計教程撰寫,有什么不足之處請大家指出,或在老貓的理想BLOG留言。這次我們首先講解一下類型轉(zhuǎn)換,我們在寫程序時經(jīng)常用到類型轉(zhuǎn)換,而且特別多的規(guī)則。我在這里粗略的講解一下。隱式轉(zhuǎn)換是系統(tǒng)默認的、不需要加以聲明即可進行的轉(zhuǎn)換。1.隱式數(shù)值轉(zhuǎn)換隱式數(shù)值轉(zhuǎn)換實際上就是從...
本教程參考C#和ASP.NET程序設(shè)計教程撰寫,有什么不足之處請大家指出,或在老貓的理想BLOG留言。
這次我們首先講解一下類型轉(zhuǎn)換,我們在寫程序時經(jīng)常用到類型轉(zhuǎn)換,而且特別多的規(guī)則。我在這里粗略的講解一下。
隱式轉(zhuǎn)換是系統(tǒng)默認的、不需要加以聲明即可進行的轉(zhuǎn)換。
1.隱式數(shù)值轉(zhuǎn)換
隱式數(shù)值轉(zhuǎn)換實際上就是從低精度的數(shù)值類型轉(zhuǎn)換到高精度的數(shù)值類型的轉(zhuǎn)換。byte x=255;ushort y=x;y=65535;float z=y;//均從低精度到高精度,反之會產(chǎn)生溢出隱式數(shù)值轉(zhuǎn)換的類型太多,我就不多介紹,記住上面的原則就可以了。詳細規(guī)則可查看msdn
2.隱式枚舉轉(zhuǎn)換
隱式枚舉轉(zhuǎn)換用于把十進制整數(shù)0轉(zhuǎn)換成任何枚舉類型,對應(yīng)的其他整數(shù)則不存在這種轉(zhuǎn)換。using System;
enum Color
{
Red,Green,Blue
};
class MikeCat
{
static void Main()
{
Color c;//聲明Color的變量c;
c=0;//將0轉(zhuǎn)換為Red;
Console.WriteLine("c的值是{0}",c);//結(jié)果:c的值是Red;如果將c=0改成c=1,則編譯器會給出錯誤。
}
}3.隱式引用轉(zhuǎn)換
從任何引用類型到object的轉(zhuǎn)換。
從類類型A到類類型B的轉(zhuǎn)換,其中類A從類B派生得到。
從類類型A到接口類型B的轉(zhuǎn)換,其中類A實現(xiàn)了接口B。
從接口類型A到接口類型B的轉(zhuǎn)換,其中接口A是從接口B派生。
從任何數(shù)組類型到System.Array的轉(zhuǎn)換。
從任何委托類型到System.Delegate的轉(zhuǎn)換。
從任何數(shù)組類型或委托類型到System.ICloneable的轉(zhuǎn)換。
從空類型(null)到任何引用類型的轉(zhuǎn)換。
顯示轉(zhuǎn)換也稱為強制轉(zhuǎn)換,它需要用戶明確地指定轉(zhuǎn)換的類型。char c=(char)65;//A
int i=(int)'A';//65顯示轉(zhuǎn)換包含所有的隱式轉(zhuǎn)換,即任何系統(tǒng)允許的隱式轉(zhuǎn)換寫成顯示轉(zhuǎn)換的形式都是允許的。int i=300;
long l=(long)i;另外一例: using System;
class MikeCat
{
static void Main()
{
long longValue = Int64.MaxValue;
int intValue = (int) longValue;
Console.WriteLine("(int){0} = {1}", longValue, intValue);
}
}類型 long 轉(zhuǎn)換為 int 是顯式轉(zhuǎn)換,它使用了強制轉(zhuǎn)換表達式。輸出為:
(int) 9223372036854775807 = -1這是因為有溢出發(fā)生。
1.顯示數(shù)值轉(zhuǎn)換
顯示數(shù)值轉(zhuǎn)換是指當不存在相應(yīng)的隱式轉(zhuǎn)換時從一種數(shù)值類型轉(zhuǎn)換為另一種數(shù)值類型。轉(zhuǎn)換類型也很繁瑣,只需記住轉(zhuǎn)換規(guī)則,詳細查閱MSDN。由于顯示數(shù)值轉(zhuǎn)換可能丟失信息或引發(fā)異常,因此轉(zhuǎn)換按以下原理被處理:簡略說就是高精度顯示轉(zhuǎn)換為低精度會引發(fā)異常(OverFlowException),未引發(fā)異常的情況,源變量的值通過舍入得到最接近的整型值作為轉(zhuǎn)換結(jié)果。詳細轉(zhuǎn)換時的異常情況查閱MSDN/*test.cs*/
using System;
public class MikeCat
{
public static void Main()
{
ushort u=65535;
byte b=(byte)u;
Console.WriteLine("b的值是{0}",b);
}
}編譯狀況如下:
E:\>csc test.cs
Microsoft (R) Visual C# .NET 編譯器版本 7.10.3052.4
用于 Microsoft (R) .NET Framework 版本 1.1.4322
版權(quán)所有 (C) Microsoft Corporation 2001-2002。保留所有權(quán)利。
E:\>test.exe
b的值是255
E:\>csc/checked test.cs ///checked[+ -] 生成溢出檢查
E:\>test.exe
未處理的異常: System.OverflowException: 算術(shù)運算導致溢出。
at MikeCat.Main()
E:\>csc/checked- test.cs
E:\>test.exe
b的值是255
2.顯示枚舉轉(zhuǎn)換
顯示枚舉轉(zhuǎn)換其實就是將枚舉類型的元素類型與相應(yīng)類型之間進行隱式顯示轉(zhuǎn)換。比如,有一個元素類型int的枚舉類型E,當執(zhí)行從E到byte的顯示枚舉轉(zhuǎn)換時,實際執(zhí)行的是從int到byte的顯示數(shù)值轉(zhuǎn)換。using System;
enum Color
{
Red,Green,Blue
};
public class MikeCat
{
static void Main()
{
Color c;//聲明Color的變量c;
c=(Color)4;//對數(shù)字3進行顯示枚舉轉(zhuǎn)換
Console.WriteLine("c的值是{0}",c);
}
}結(jié)果:c的值是4
Convert 類
將一個基本數(shù)據(jù)類型轉(zhuǎn)換為另一個基本數(shù)據(jù)類型。
該類返回值與指定類型的值等效的類型。受支持的基類型是 Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、 Double、Decimal、DateTime 和 String。
存在將每個基類型轉(zhuǎn)換為每個其他基類型的轉(zhuǎn)換方法。不過,所執(zhí)行的實際轉(zhuǎn)換操作分為三類:
從某類型到它本身的轉(zhuǎn)換只返回該類型。不實際執(zhí)行任何轉(zhuǎn)換。
無法產(chǎn)生有意義的結(jié)果的轉(zhuǎn)換引發(fā) InvalidCastException。不實際執(zhí)行任何轉(zhuǎn)換。下列轉(zhuǎn)換會引發(fā)異常:從 Char 轉(zhuǎn)換為 Boolean、Single、Double、Decimal 或 DateTime,以及從這些類型轉(zhuǎn)換為 Char。下列轉(zhuǎn)換會引發(fā)異常:從 DateTime 轉(zhuǎn)換為除 String 之外的任何類型,以及從任何類型(String 除外)轉(zhuǎn)換為 DateTime。
任何基類型(上面描述的基類型除外)都可以與任何其他基類型進行相互轉(zhuǎn)換。
如果數(shù)字類型轉(zhuǎn)換導致精度丟失(即某些最低有效位丟失),不引發(fā)異常。但是,如果結(jié)果超出了特定轉(zhuǎn)換方法的返回值類型所能表示的范圍,則將引發(fā)異常。
下面介紹一下和類型轉(zhuǎn)換相關(guān)的裝箱、取消裝箱
裝箱是值類型到 object 類型或到該值類型所實現(xiàn)的任何接口類型的隱式轉(zhuǎn)換。將一個值的值裝箱會分配一個對象實例并將該值復(fù)制到新的對象中。
請看以下值類型變量的聲明:
int i = 123; 以下語句對變量 i 隱式應(yīng)用裝箱操作:
object o = i;
此語句的結(jié)果是在堆棧上創(chuàng)建對象 o,而該對象在堆上引用 int 類型的值。該值是賦給變量 i 的值類型值的一個副本。下圖說明了兩個變量 i 和 o 之間的差異。
裝箱轉(zhuǎn)換
在堆棧上 在堆上
i 123
int i=123;
o (將i裝箱)
object o=i; int 123
也可以(但絕不必要)如下例所示顯式執(zhí)行裝箱:
int i = 123;
object o = (object) i;
示例
此例將整數(shù)變量 i 通過裝箱轉(zhuǎn)換為對象 o。這樣,存儲在變量 i 中的值就從 123 更改為 456。此例顯示對象保留了內(nèi)容的原始副本,即 123。 // boxing.cs
// Boxing an integer variable
using System;
class TestBoxing
{
public static void Main()
{
int i = 123;
object o = i; // Implicit boxing
i = 456; // Change the contents of i
Console.WriteLine("The value-type value = {0}", i);
Console.WriteLine("The object-type value = {0}", o);
}
}輸出
The value-type value = 456
The object-type value = 123
取消裝箱
取消裝箱是從 object 類型到值類型或從接口類型到實現(xiàn)該接口的值類型的顯式轉(zhuǎn)換。取消裝箱操作包括:
檢查對象實例,確保它是給定值類型的一個裝箱值。
將該值從實例復(fù)制到值類型變量中。
以下語句同時說明了裝箱和取消裝箱操作:
int i = 123; // A value type
object box = i; // Boxing
int j = (int)box; // Unboxing下圖顯示了以上語句的結(jié)果。
取消裝箱轉(zhuǎn)換
在堆棧上 在堆上
i 123
int i=123;
o (將i裝箱)
object o=i; int 123
j 123
int j=(int) o;
為使到給定值類型的取消裝箱轉(zhuǎn)換在運行時取得成功,源參數(shù)的值必須是對某個對象的引用,而該對象先前是通過將該值類型的值裝箱創(chuàng)建的。如果源參數(shù)為 null 或是對一個不兼容對象的引用,則會引發(fā) InvalidCastException。
示例
下面的示例闡釋無效取消裝箱的情況,即錯誤的取消裝箱如何導致 InvalidCastException。通過使用 try 和 catch,發(fā)生錯誤時會顯示錯誤信息。
using System;
public class UnboxingTest
{
public static void Main()
{
int intI = 123;
// Boxing
object o = intI;
// Reference to incompatible object produces InvalidCastException
try
{
int intJ = (short) o;
Console.WriteLine("Unboxing OK.");
}
catch (InvalidCastException e)
{
Console.WriteLine("{0} Error: Incorrect unboxing.",e);
}
}
} 輸出
System.InvalidCastException
at UnboxingTest.Main() Error: Incorrect unboxing.
如果將下列語句:
int intJ = (short) o;
更改為:
int intJ = (int) o;
轉(zhuǎn)換將執(zhí)行,而您將得到輸出“Unboxing OK”。