運(yùn)算符和強(qiáng)制類型轉(zhuǎn)換
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
本文主要介紹一下C#中的運(yùn)算符和類型強(qiáng)制轉(zhuǎn)換,主要內(nèi)容包括
1.C#中的可用運(yùn)算符 2.處理引用類型和值類型時(shí)相等的含義 3.基本數(shù)據(jù)類型之間的數(shù)據(jù)轉(zhuǎn)換 4.裝箱和開箱技術(shù) 5.通過強(qiáng)制轉(zhuǎn)換技術(shù)在引用類型之間轉(zhuǎn)換 6.運(yùn)算符重載 7.自定義類型強(qiáng)制轉(zhuǎn)換 下面詳細(xì)介紹這7點(diǎn)內(nèi)容 一、C#中的可用運(yùn)算符 C#中的運(yùn)算符跟c語言中的差不多,這里介紹幾個(gè)特殊的運(yùn)算符 1.1 check和uncheck運(yùn)算符 如果把一個(gè)代碼塊標(biāo)記為checked,CLR就會(huì)執(zhí)行溢出檢查,如果發(fā)生溢出,就拋出異常。如果要禁止溢出檢查,可以把代碼標(biāo)記為unchecked。unchecked是默認(rèn)值。 //運(yùn)行下面這段代碼,就會(huì)拋出異常 byte b=255; checked { b++; } Console.WriteLine(b.ToString()); //運(yùn)行下面這段代碼,則不會(huì)拋出異常 byte b=255; unchecked { b++; } Console.WriteLine(b.ToString()); 1.2 is運(yùn)算符 is運(yùn)算符可以檢查對(duì)象是否與特定的類型兼容。 int i = 10; if(i is object) { Console.WriteLine("i is an object"); } 1.3 as運(yùn)算符 as運(yùn)算符用于執(zhí)行引用類型的顯示類型轉(zhuǎn)換。如果轉(zhuǎn)換類型與指定的類型兼容,轉(zhuǎn)換成功;如果不兼容,返回null object o1 = "some string"; object o2 = 5; string s1 = o1 as string; //s1="some string" string s2 = o2 as string; //s2=null 1.4 sizeof運(yùn)算符 使用sizeof運(yùn)算符可以確定堆棧中值類型需要的長(zhǎng)度(單位字節(jié)):注意只能在不安全的代碼中使用sizeof 例如:sizeof(int) 1.5 type運(yùn)算符 返回一個(gè)表示特定類型的Type對(duì)象。 例如:typeof(string)返回表示System.String類型的Type對(duì)象。在使用反射動(dòng)態(tài)查找對(duì)象信息時(shí),這個(gè)運(yùn)算很有效。 二、類型轉(zhuǎn)換 2.1 隱式轉(zhuǎn)換 只能從較小的整數(shù)類型隱式轉(zhuǎn)換為較大的整數(shù)類型,不能從較大的整數(shù)類型隱式地轉(zhuǎn)換為較小地整數(shù)類型。 無符號(hào)的變量可以轉(zhuǎn)換為有符號(hào)的變量,只要無符號(hào)的變量值的大小在有符號(hào)的變量的范圍之內(nèi)即可。 例如: byte v1 = 10; byte v2 = 23; long total; total = v1 + v2;//v1、v2均隱式轉(zhuǎn)換為long類型 2.2顯示轉(zhuǎn)換 在不能隱式轉(zhuǎn)換的時(shí)候,可以顯示執(zhí)行這些轉(zhuǎn)換。格式如下: long val = 3000000000; 所有的顯示數(shù)據(jù)類型轉(zhuǎn)換都可能不安全,在應(yīng)用程序中應(yīng)包含處理可能失敗的數(shù)據(jù)類型轉(zhuǎn)換的代碼。例如:try/catch等int i = (int)val;//編譯不會(huì)報(bào)錯(cuò) 顯示轉(zhuǎn)換有一些限制,值類型只能在數(shù)字、char類型和enum類型之間轉(zhuǎn)換。不能直接把Boolean數(shù)據(jù)類型轉(zhuǎn)換為其他類型,也不能把其他類型轉(zhuǎn)換為Boolean數(shù)據(jù)類型。 2.3裝箱和取消裝箱 裝箱可以把值類型轉(zhuǎn)換成引用類型(boxing),取消裝箱可以把引用類型轉(zhuǎn)換成值類型(unboxing) int i = 20; object o = i; //boxing int j = (int)o; //unboxing 三、對(duì)象的相等比較 3.1 引用類型的相等比較 有四種方法: 1)ReferenceEquals()方法 ReferenceEquals()方法是一個(gè)靜態(tài)方法,不能重寫,只能使用System.object實(shí)現(xiàn)。如果提供的兩個(gè)引用指向同一個(gè)對(duì)象實(shí)例,ReferenceEquals()方法 返回true,否則返回false。但是該方法認(rèn)為null等于null。 SomeClass x,y; x = new SomeClass(); y = new SomeClass(); bool B1 = ReferenceEquals(null,null);// return true; bool B2 = ReferenceEquals(null,x);// return false; bool B3 = ReferenceEquals(x,y);// return false because x and y point to different objects; 2)虛擬的Equals()方法 Equals()方法是虛擬的,所以可以在自己的類中重寫。 3)靜態(tài)的Equals()方法 靜態(tài)的Equals()方法和虛擬的Equals()方法作用相同,區(qū)別是靜態(tài)版本帶有兩個(gè)參數(shù)。靜態(tài)方法可以處理兩個(gè)對(duì)象中有一個(gè)是null的情況。 4)比較運(yùn)算符== ==可以看作是嚴(yán)格值比較和嚴(yán)格引用比較之間的中間選項(xiàng),使用時(shí)最好重寫==運(yùn)算符 3.2 值類型的相等比較 值類型的相等比較與引用類型的相等比較采用相同的規(guī)則,最大的區(qū)別就是值類型需要裝箱,才能執(zhí)行上面介紹的四種方法。 四、運(yùn)算符重載 4.1 算術(shù)運(yùn)算符重載 例如: //定義結(jié)構(gòu)Vector 注意:C#不允許重載=運(yùn)算符,但如果重載+運(yùn)算符,編譯器就會(huì)自動(dòng)使用+運(yùn)算符的重載來執(zhí)行+=運(yùn)算符的操作。-=、&=、*=、/=也遵循此規(guī)則struct Vector { public double x,y,z; public Vector(double x,double y,double z) { this.x = x; this.y = y; this.z = z; } public Vector(Vector rhs) { this.x = rhs.x; this.y = rhs.y; this.z = rhs.z; } public override string ToString() { return "(" + x + "," + y + "," + z + ")"; } //重載+運(yùn)算符 public static Vector operator + (Vector lhs, Vector rhs)//C#要求所有的運(yùn)算符重載都聲明為public和static { Vector result = new Vector(lhs); result.x += rhs.x; result.y += rhs.y; result.z += rhs.z; return result; } } //測(cè)試 static Main() { Vector vect1,vect2,vect3; vect1 = new Vector(3.0,3.0,1.0); vect2 = new Vector(2.0,-4.0,-4.0); vect3 = vect1 + vect2; Console.WriteLine("vect1=" + vect1.ToString()); Console.WriteLine("vect2=" + vect2.ToString()); Console.WriteLine("vect3=" + vect3.ToString()); } //編譯運(yùn)行,結(jié)果如下: vect1=(3,3,1) vect2=(2,-4,-4) vect3=(5,-1,-3) 4.2 比較運(yùn)算符重載 1)C#要求成對(duì)重載比較運(yùn)算符(==和!=、>和<、>=和<=共3對(duì)),如果不成對(duì)重載,編譯就會(huì)出錯(cuò)。 2)必須返回bool類型的值。 注意:重載==和!=時(shí),還應(yīng)重載System.object的Equals()方法和GetHashCode()方法,否則產(chǎn)生一個(gè)編譯警告。因?yàn)镋quals()方法執(zhí)行與==相同的相等邏輯。 除此之外,比較運(yùn)算符重載跟算術(shù)運(yùn)算符的重載沒有區(qū)別。 五、用戶定義的數(shù)據(jù)類型轉(zhuǎn)換 用戶定義的數(shù)據(jù)類型轉(zhuǎn)換和預(yù)定義的數(shù)據(jù)類型轉(zhuǎn)換一樣,也分隱式轉(zhuǎn)換和顯示轉(zhuǎn)換兩種。 如果知道無論在源變量中存儲(chǔ)什么值,數(shù)據(jù)類型轉(zhuǎn)換總是安全的,就可以用隱式轉(zhuǎn)換; 如果某些數(shù)據(jù)值可能會(huì)出錯(cuò),就應(yīng)該把數(shù)據(jù)類型轉(zhuǎn)換定義為顯示的。 定義數(shù)據(jù)類型的轉(zhuǎn)換類似于運(yùn)算符重載: public static implicit operator float(Currency value) 執(zhí)行用戶類型轉(zhuǎn)換的完整示例:{ //processing } struct Currency { public uint Dollars; public ushort Cents; public Currency(uint dollars, ushort cents) { this.Dollars = dollars; this.Cents = cents; } public override string ToString() { return string.Format("${0}.{1,-2.00}",Dollars,Cents); } //隱式轉(zhuǎn)換 public static operator float(Currency value) { return value.Dollars + (value.Cents/100.0f ); //顯示轉(zhuǎn)換 public static operator Currency(float value) { uint dollars = (uint)value; ushort cents = (ushort)((value-dollars)*100); return new Currency(dollars,cents); } } } //測(cè)試 static Main() { Currency balance = new Currency(50,35); Console.WriteLine(balance); Console.WriteLine("balance is " + balance); Console.WriteLine("balance is (using ToString())" + balance.ToString()); float balance2 = balance; Console.WriteLine("After converting to float," + balance2); balance = (Currency)balance2; Console.WriteLine("After converting back to currency," + balance); } //結(jié)果 50.35 balance is $50.35 balance is (using ToString()) $50.35 After converting to float,50.35 After converting back to currency,$50.34" 5.1 類之間的數(shù)據(jù)類型轉(zhuǎn)換 兩個(gè)限制: 1)如果某個(gè)類直接或間接繼承了另一個(gè)類,就不能在這兩個(gè)類之間進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。 2)數(shù)據(jù)類型轉(zhuǎn)換必須在源或者目標(biāo)數(shù)據(jù)類型定義的內(nèi)部定義。 5.2 基類和派生類之間的數(shù)據(jù)轉(zhuǎn)換 //類MyDerived派生于類MyBase MyDerived derivedObject = new MyDerived(); MyBase baseCopy = derivedObject;//隱式轉(zhuǎn)換 MyBase baseObject = new MyBase(); MyDerived derivedCopy = (Myderived)baseObject;//拋出異常 5.3 裝箱和取消裝箱數(shù)據(jù)類型轉(zhuǎn)換 值類型到object的轉(zhuǎn)換是隱式轉(zhuǎn)換 ,即裝箱 Curency banlance = new Currency(40,10); object到值類型的轉(zhuǎn)換是顯示轉(zhuǎn)換,即取消裝箱object baseCopy = banlance;//隱式轉(zhuǎn)換 object derivedObject = new Currency(40,10); object baseObject = new object(); Currency derivedCopy1 = (Currency)derivedObject;//OK Currency derivedCopy2 = (Currency)baseObject;//拋出異常 5.4 多重?cái)?shù)據(jù)類型轉(zhuǎn)換 Currency balance = new Currency(40,10); long amount = (long)balance;//Currency->float->long double amountD = balance;//Currency->float->double 該文章在 2017/2/7 18:51:16 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |