国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

Csharp+Asp.net系列教程(三)

2024-07-10 12:57:55
字體:
供稿:網(wǎng)友
邁克老貓
來自:老貓的理想

本教程參考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ù)運算導(dǎo)致溢出。
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)換導(dǎo)致精度丟失(即某些最低有效位丟失),不引發(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。
示例
下面的示例闡釋無效取消裝箱的情況,即錯誤的取消裝箱如何導(dǎo)致 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”。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 奈曼旗| 黎城县| 双柏县| 金溪县| 错那县| 西藏| 普兰县| 建阳市| 台江县| 忻州市| 拉萨市| 承德县| 普宁市| 汝城县| 海林市| 邻水| 育儿| 营口市| 揭东县| 金阳县| 兰州市| 新河县| 常州市| 辽宁省| 微博| 库尔勒市| 新余市| 长乐市| 遂川县| 五台县| 城口县| 武宣县| 德化县| 阿荣旗| 郎溪县| 新田县| 金华市| 鄢陵县| 临颍县| 铁岭县| 曲麻莱县|