狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

運(yùn)算符和強(qiáng)制類(lèi)型轉(zhuǎn)換

admin
2017年2月7日 18:51 本文熱度 6233
本文主要介紹一下C#中的運(yùn)算符和類(lèi)型強(qiáng)制轉(zhuǎn)換,主要內(nèi)容包括
1.C#中的可用運(yùn)算符
2.處理引用類(lèi)型和值類(lèi)型時(shí)相等的含義
3.基本數(shù)據(jù)類(lèi)型之間的數(shù)據(jù)轉(zhuǎn)換
4.裝箱和開(kāi)箱技術(shù)
5.通過(guò)強(qiáng)制轉(zhuǎn)換技術(shù)在引用類(lèi)型之間轉(zhuǎn)換
6.運(yùn)算符重載
7.自定義類(lèi)型強(qiáng)制轉(zhuǎn)換
下面詳細(xì)介紹這7點(diǎn)內(nèi)容

一、C#中的可用運(yùn)算符
C#中的運(yùn)算符跟c語(yǔ)言中的差不多,這里介紹幾個(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ì)象是否與特定的類(lèi)型兼容。
int i = 10;
if(i is object
)
{
  Console.WriteLine(
"i is an object"
);
}

1.3 as運(yùn)算符
as運(yùn)算符用于執(zhí)行引用類(lèi)型的顯示類(lèi)型轉(zhuǎn)換。如果轉(zhuǎn)換類(lèi)型與指定的類(lèi)型兼容,轉(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)算符可以確定堆棧中值類(lèi)型需要的長(zhǎng)度(單位字節(jié)):注意只能在不安全的代碼中使用sizeof
例如:sizeof(int)

1.5 type運(yùn)算符
返回一個(gè)表示特定類(lèi)型的Type對(duì)象。
例如:typeof(string)返回表示System.String類(lèi)型的Type對(duì)象。在使用反射動(dòng)態(tài)查找對(duì)象信息時(shí),這個(gè)運(yùn)算很有效。

二、類(lèi)型轉(zhuǎn)換

2.1 隱式轉(zhuǎn)換
只能從較小的整數(shù)類(lèi)型隱式轉(zhuǎn)換為較大的整數(shù)類(lèi)型,不能從較大的整數(shù)類(lèi)型隱式地轉(zhuǎn)換為較小地整數(shù)類(lèi)型。
無(wú)符號(hào)的變量可以轉(zhuǎn)換為有符號(hào)的變量,只要無(wú)符號(hào)的變量值的大小在有符號(hào)的變量的范圍之內(nèi)即可。
例如:
byte v1 = 10;
byte v2 = 23
;
long
 total;
total 
= v1 + v2;//v1、v2均隱式轉(zhuǎn)換為long類(lèi)型

2.2顯示轉(zhuǎn)換
在不能隱式轉(zhuǎn)換的時(shí)候,可以顯示執(zhí)行這些轉(zhuǎn)換。格式如下:
long val = 3000000000;
int i = (int)val;//編譯不會(huì)報(bào)錯(cuò)
所有的顯示數(shù)據(jù)類(lèi)型轉(zhuǎn)換都可能不安全,在應(yīng)用程序中應(yīng)包含處理可能失敗的數(shù)據(jù)類(lèi)型轉(zhuǎn)換的代碼。例如:try/catch等
顯示轉(zhuǎn)換有一些限制,值類(lèi)型只能在數(shù)字、char類(lèi)型和enum類(lèi)型之間轉(zhuǎn)換。不能直接把Boolean數(shù)據(jù)類(lèi)型轉(zhuǎn)換為其他類(lèi)型,也不能把其他類(lèi)型轉(zhuǎn)換為Boolean數(shù)據(jù)類(lèi)型。

2.3裝箱和取消裝箱
裝箱可以把值類(lèi)型轉(zhuǎn)換成引用類(lèi)型(boxing),取消裝箱可以把引用類(lèi)型轉(zhuǎn)換成值類(lèi)型(unboxing)
int i = 20;

object o = i;  //boxing


int j = (int)o; //unboxing

三、對(duì)象的相等比較

3.1 引用類(lèi)型的相等比較
有四種方法:
1)ReferenceEquals()方法
      ReferenceEquals()方法是一個(gè)靜態(tài)方法,不能重寫(xiě),只能使用System.object實(shí)現(xiàn)。如果提供的兩個(gè)引用指向同一個(gè)對(duì)象實(shí)例,ReferenceEquals()方法
返回true,否則返回false。但是該方法認(rèn)為null等于null。
SomeClass x,y;
= new
 SomeClass();
= 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()方法是虛擬的,所以可以在自己的類(lèi)中重寫(xiě)。
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í)最好重寫(xiě)==運(yùn)算符

3.2 值類(lèi)型的相等比較
      值類(lèi)型的相等比較與引用類(lèi)型的相等比較采用相同的規(guī)則,最大的區(qū)別就是值類(lèi)型需要裝箱,才能執(zhí)行上面介紹的四種方法。

四、運(yùn)算符重載

 4.1 算術(shù)運(yùn)算符重載    例如:
//定義結(jié)構(gòu)Vector
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)
注意:C#不允許重載=運(yùn)算符,但如果重載+運(yùn)算符,編譯器就會(huì)自動(dòng)使用+運(yùn)算符的重載來(lái)執(zhí)行+=運(yùn)算符的操作。-=、&=、*=、/=也遵循此規(guī)則

4.2 比較運(yùn)算符重載
1)C#要求成對(duì)重載比較運(yùn)算符(==和!=、>和<、>=和<=共3對(duì)),如果不成對(duì)重載,編譯就會(huì)出錯(cuò)。
2)必須返回bool類(lèi)型的值。
注意:重載==和?。綍r(shí),還應(yīng)重載System.object的Equals()方法和GetHashCode()方法,否則產(chǎn)生一個(gè)編譯警告。因?yàn)镋quals()方法執(zhí)行與==相同的相等邏輯。
除此之外,比較運(yùn)算符重載跟算術(shù)運(yùn)算符的重載沒(méi)有區(qū)別。

五、用戶(hù)定義的數(shù)據(jù)類(lèi)型轉(zhuǎn)換

用戶(hù)定義的數(shù)據(jù)類(lèi)型轉(zhuǎn)換和預(yù)定義的數(shù)據(jù)類(lèi)型轉(zhuǎn)換一樣,也分隱式轉(zhuǎn)換和顯示轉(zhuǎn)換兩種。
如果知道無(wú)論在源變量中存儲(chǔ)什么值,數(shù)據(jù)類(lèi)型轉(zhuǎn)換總是安全的,就可以用隱式轉(zhuǎn)換;
如果某些數(shù)據(jù)值可能會(huì)出錯(cuò),就應(yīng)該把數(shù)據(jù)類(lèi)型轉(zhuǎn)換定義為顯示的。
定義數(shù)據(jù)類(lèi)型的轉(zhuǎn)換類(lèi)似于運(yùn)算符重載:
public static implicit operator float(Currency value)
{
  
//processing

}
執(zhí)行用戶(hù)類(lèi)型轉(zhuǎn)換的完整示例:
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 類(lèi)之間的數(shù)據(jù)類(lèi)型轉(zhuǎn)換
     兩個(gè)限制:
     1)如果某個(gè)類(lèi)直接或間接繼承了另一個(gè)類(lèi),就不能在這兩個(gè)類(lèi)之間進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換。
     2)數(shù)據(jù)類(lèi)型轉(zhuǎn)換必須在源或者目標(biāo)數(shù)據(jù)類(lèi)型定義的內(nèi)部定義。

5.2 基類(lèi)和派生類(lèi)之間的數(shù)據(jù)轉(zhuǎn)換       
//類(lèi)MyDerived派生于類(lèi)MyBase
  MyDerived derivedObject = new MyDerived();
  MyBase baseCopy 
= derivedObject;//隱式轉(zhuǎn)換


  MyBase baseObject 
= new MyBase();
  MyDerived derivedCopy 
= (Myderived)baseObject;//
拋出異常

5.3 裝箱和取消裝箱數(shù)據(jù)類(lèi)型轉(zhuǎn)換
      值類(lèi)型到object的轉(zhuǎn)換是隱式轉(zhuǎn)換 ,即裝箱     
Curency banlance = new Currency(40,10);
object baseCopy = banlance;//隱式轉(zhuǎn)換
     object到值類(lèi)型的轉(zhuǎn)換是顯示轉(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ù)類(lèi)型轉(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ò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved