c中的as起到什麼用,C 中as 運算子的作用是什麼?

時間 2022-01-18 13:05:47

1樓:匿名使用者

c#中使用as進行型別轉換

在程式中,進行型別轉換是常見的事。那麼在c#中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如:

object objtest = new newtype();

newtype newvalue = (newtype)objtest;

但是這樣轉換,有個嚴重的問題,就是在把objtest強轉換成newtype型別物件的時候,這個過程是不安全的,因此需要用try-catch語句來進行保護。這樣一來,比較安全的**方式應該如下所示。

object objtest = new newtype();

newtype newvalue = null;

trycatch( exception err )

但是如上的寫法在c#中已經屬於過時的寫法,而且也屬於比較低效的寫法。在c#中比較高效而且安全的寫法,應該用as操作符,那麼完成如上類似功能的正確**應該如下。

object objtest = new newtype();

newtype newvalue = objtest as newtype;

那麼很明顯,如上的寫法首先看起來很簡便,至少**數量和強轉方式一樣。至於安全性,對於as操作符來說,它不會做過的轉換操作,當需要轉換物件的型別屬於轉換目標型別或者轉換目標型別的派生型別的時候,那麼此轉換操作才能成功,而且並不產生新的物件。因此用as來進行型別轉換使安全的。

為什麼用as操作符進行型別轉換的效率要高於老式的型別轉換的,因為用as操作符進行轉換就如前面所說的,首先判斷當前物件的型別,當型別滿足要求後才進行轉換。而傳統的型別轉換方式,是用當前物件直接去轉換,而且為了保護轉換成功,要加上try-catch,這就決定了它的效率不會高於as操作符的效率。

要注意的時候,不管用傳統方式,還是用as操作符進行型別轉換之後,在使用之前,需要進行判斷轉換是否成功,如下:

if( newvalue!= null )

但是,使用as操作符有如下幾點限制。

第乙個就是,不用在型別之間進行型別轉化,即如下編寫就會出現編譯錯誤。

newtype newvalue = new newtype();

newtype1 newvalue = newvalue as newtype1;

第二個就是,不能應用在值型別資料,即不能如下寫(也會出現編譯錯誤)。

object objtest = 11;

int nvalue = objtest as int;

對於第一點所提的,可以用傳統的型別轉換方式來完成,但是光用如下的方式,是不能正確完成。

newtypeone newtestone = new newtypeone();

newtypetwo newtesttwo = (newtypetwo)newtestone;

但是光如上寫是不能完成的,要想使如上的操作能正確完成,在原有型別中增加型別轉換操作符函式,即需要完成類似如下的**。

public class newtypeone

}對於第二點所提的,在c#中可以使用is操作符,再加上老式的型別轉換操作,就可以安全完成轉換,那麼要完成如上操作,正確的寫法如下。

object objtest = 11;

if( objtest is int )

除了如上兩點限制外,在用as操作符來進行型別轉換的時候,有個細微的問題。在前面所說的,用as來進行型別轉換的時候,所要轉換的物件型別必須是目標型別或者轉換目標型別的派生型別,那麼這樣就有個問題,即用as操作符來進行型別轉換的時候無法轉換成正確的型別,也就是說本來應該轉換成子型別,卻轉換成了父型別。但是我並不認為這是個嚴重問題,因為在用as操作符來進行型別轉換的時候,如何選擇目標型別在編碼的時候已經很明確了,即用父型別作為目標型別,那麼型別轉換的目的就是轉換成父型別物件進行操作;反之亦然。

在c#中已經提供了乙個很好的型別轉換方式,那麼在進行型別轉換的時候,可以按照如下的方式進行選擇。

2樓:碧燎伯醉柳

as是用於檢查在相容的引用型別之間執行某些型別的轉換,注意只有引用型別才可以,如果相容as會返回對同乙個物件的乙個非null的引用,否則返回乙個null。

簡單的說就是,如果乙個物件可以被轉換成as後面的那個型別,那麼就會返回這個型別的物件,否則就會得到乙個null。

需要注意的是只有引用型別才可以用as,比如:

objecta=

11;intb=

aasint;

//這樣的用法是錯誤的,因為int型別是值引用

3樓:修海枚曼安

父類引用指向子類物件cir是circle型別,cir2也是circle型別。

其中shp=cir這不是賦值這是乙個指向操作。也就c++中所說的指標。

你想一下shp可以等於null為什麼就不能等於cir呢?

4樓:匿名使用者

as用來把乙個引用型別型別轉換為另一種引用型別。如果能轉換,返回他目標型別。轉換不成功,就返回null

5樓:匿名使用者

首先,bs複製的

as是用來型別轉換的

比如:兩個類:a和b

b b = new b();

//不用as,進行強制轉換,如果型別不匹配,會引發轉換異常a a = (a) b;

//使用as,型別不匹配,不會引發異常,會返回乙個null,此時 a = null

a a = b as a;

6樓:匿名使用者

as是強制轉換..其類型別必須支援轉換null...

7樓:肥菲富嬋

定義:可以使用

as運算子執行轉換的某些型別在相容之間的引用型別或可以為

null

的型別。

備註:as

運算子類似於強制轉換操作。

但是,如果轉換是不可能的,as

返回null

而不引發異常。請注意

as運算子執行只引用轉換、nullable

轉換和裝箱轉換。

as運算子不能執行其他轉換,如使用者定義的轉換,應是通過使用轉換的表示式。

expression

astype

expression

istype

?(type)expression

:(type)null

這兩個表示式是等效的,但

expression

變數只計算一次。

示例:object

myobject

=new

object();

//建立乙個object物件

classaa=

myobject

asclassa;

//將它轉換為classa型別,此操作會失敗,但不會拋異常,a會被設定為null

a.tostring();

//訪問a會丟擲乙個system.nullreferenceexception異常

as的工作方式和強制類轉換一樣,但是它永遠不會丟擲乙個異常,如果指定的操作不能正確地進行轉換,那麼得到的就是null,實際應用中通常會判斷結果是否為

null;

8樓:

as(c# 參考)

用於在相容的引用型別之間執行轉換。例如:

string s = someobject as string;

if (s != null)

as 運算子類似於強制轉換操作;但是,如果轉換不可行,as 會返回 null 而不是引發異常。更嚴格地說,這種形式的表示式

expression as type等效於expression is type ? (type)expression : (type)null

只是 expression 只被計算一次。

注意,as 運算子只執行引用轉換和裝箱轉換。as 運算子無法執行其他轉換,如使用者定義的轉換,這類轉換應使用 cast 表示式來執行。

// cs_keyword_as.cs

// the as operator.

using system;

class class1

class class2

class mainclass

:", i);

if (s != null)

else}}

}輸出0:not a string

1:not a string

2:'hello'

3:not a string

4:not a string

5:not a string

c#中as 運算子的作用是什麼?

9樓:萌神

as運算子用於執行引用型別的顯式型別轉換。 如果要轉換的型別與指定型別相容,轉換就會成功;如果型別不相容,則返回null。

表示式as 型別

as 運算子類似於型別轉換,所不同的是,當轉換失敗時,as 運算子將返回null,而不是引發異常。

as的規則如下:

�6�1 檢查物件型別的相容性,並返回結果,如果不相容就返回null;

�6�1 不會丟擲異常;

�6�1 如果結果判斷為空,則強制執行型別轉換將丟擲nullreferenceexception異常。

**如下:student s1 = studentobj as student; //如果clr檢測studentprogram引用物件型別不相容目標型別,即不能進行強制型別轉換,則返回乙個null,永遠不會丟擲異常

c#中as用法?

10樓:匿名使用者

is:檢查物件是否與給定的型別相容。例如,下面的**可以確定myobject型別的乙個例項,或者物件是否從myobject派生的乙個型別:

if(obj is myobject){}

如果所提供的表示式非空,並且所提供的物件可以強制轉換為所提供的型別而不會導致引發異常,則 is 表示式的計算結果將是 true。

如果已知表示式始終是true或始終是false,則is關鍵字將導致編譯時警告,但是通常在執行時才計算型別相容性。

注意:is執行符不能過載,is執行符只考慮引用轉換、裝箱轉換和取消裝箱轉換。不考慮其它轉換,如果使用者定義轉換。

在is運算子的左側不允許使用匿名方法。lambda表示式屬於例外。

object myobject = new object();

boolean b1 = (myobject is object); true.

boolean b2 = (myobject is employee); false.

如果物件引用是null,is運算子總是返回false,因為沒有可檢查其型別的物件。

is運算子通常像下面這樣使用:

if (myobject is employee)

在這段**中,clr實際會檢查兩次物件的型別。is運算子首先核實myobject是否相容於employee型別。如果是,那麼在if語句內部執行轉換型,clr會再次核實myobject是否引用乙個employee。

clr的型別檢查增加了安全性,但這樣對效能造成一定影響。這是因為clr首先必須判斷變數(myobject)引用的物件的實際型別。然後,clr必須遍歷繼承層次結構,用每個基型別去核對指定的型別(employee)。

由於這是乙個相當常用的程式設計模式,所以c#專門提供了as運算子,目的就是簡化這種**寫法,同時提公升效能。

as:用於檢查在相容的引用型別之間執行某些型別的轉換。

employee myemployee = myobject as employee;

if (myemployee != null)

在這段**中,clr核實myobject是否相容於employee型別;如果是,as會返回對同乙個物件的乙個非null

的引用。如果myobject不相容於employee型別,as運算子會返回null。

注意:as運算子造成clr只校驗一次物件的型別。if語句只是檢查myemployee是否為null。這個檢查的速度比校驗物件的型別快得多。

as運算子的工作方式與強制型別轉換一樣,只是它永遠不會丟擲乙個異常。相反,如果物件不能轉換,結果就是null。所以,正確的做法是檢查最終生成的一引用是否為null。

如果企圖直接使用最終生成的引用,會丟擲乙個system.nullreferenceexception異常。以下**對此進行了演示:

object o = new object(); 新建乙個object物件。

employee e = o as employee; 將o轉型為乙個employee

e.tostring(); 訪問e會丟擲乙個nullreferenceexception異常

備註:as運算子類似於強制轉換操作。但是無法進行轉換,則as返回null而非引發異常。

示例:expression as type它等效於以下表示式,但是只計算一次expression。

expression is type ?(type)expression : (type)null

注意:as運算子只執行引用轉換和裝箱轉換。as運算子無法執行其它轉換,如果使用者定義的轉換,這類轉換應使用強制轉換表示式來執行。

c中的as起到什麼用,C 中as 運算子的作用是什麼?

定義 可以使用 as 運算子執行轉換的某些型別在相容之間的引用型別或可以為 null 的型別。備註 as 運算子類似於強制轉換操作。但是,如果轉換是不可能的,as 返回 null 而不引發異常。請注意 as 運算子執行只引用轉換 nullable 轉換和裝箱轉換。as 運算子不能執行其他轉換,如使用...

C中的get和set有什麼用

get set為獲取或者設定類中的屬性 比如 private int count public int count get 可以在屬性中做驗證或者通過屬性對某個屬性進行保護 這裡在屬性宣告中要用到的 如 class classa public int a set 在類classa裡面有乙個私有的變數...

澄海3C中惡魔獵手有什麼用,澄海3C中惡魔獵手怎麼用強啊

惡魔獵手屬於前期有點用的英雄 出來公升級洗魔 我的觀點是 主公升洗魔和閃避,碰到敵人搶險吸魔 在10級以前不要和敵人硬抗 邊跑邊洗 沒有魔法的敵人就是垃圾 不要公升什麼法力燃燒 那垃圾 如果是新手的話 就不要出第2個英雄 使勁變身 然後打錢 然後吃書 如果碰到的敵人不是還bt的話還是可以的 惡魔屬於...

c裡面靜態的方法有什麼用,C 中靜態變數和方法用什麼用處

1 靜態方法作用 在呼叫方法時不用生成類例項,可以直接呼叫。2 不一定要新增建構函式,因為你新建乙個類,系統會預設乙個建構函式。其實你寫的建構函式都是對系統預設的重寫。如下 class demo 這裡系統自動給你生成了乙個預設的構造方法public demo 只是沒顯示出來 裡面也沒什麼執行的語句,...

c new有什麼用,C 中的new是什麼意思啊

簡而言之就是用來例項化。假如 你定義了乙個類叫person,然後類裡面有屬性eye,hair,然後還有乙個方法cut 那麼你需要用到person類裡面的屬性方法的話,你就必須要先有乙個person的例項。此時就要用到new來例項了。根據我的假如 可以寫如下簡單 供你參考。class person 定...