C 中 AS與IS 的對比

2021-08-17 06:10:36 字數 1382 閱讀 1890

在c#語言中進行型別轉換的操作符is和as。is和as都是強制型別轉換,但這兩者有什麼相同之處和不同之處呢?在使用is和as需要注意哪些事項?下面我們從簡單的**示例去**這個簡單的問題。注:此博文只是本人學習過程中一些簡要記錄,新手可以看一下,高手略過。

is檢查乙個物件是否相容於指定的型別,並返回乙個boolean值:true或者fasle。注意,is操作符永遠不會丟擲異常,請看以下示例:

classa

object o=new object();

boolean b1=(o is object); //b1為true. 

boolean b2=(o is classa) ; b2為false.

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

is 操作符通常像下面這樣使用:

if(obj is classa)

在這一段**中,clr實際會檢查兩次物件型別。is操作符首先核實obj是否相容於classa 型別。如果是,那麼在if語句內部執行型別轉換時,clr再次核實obj是否引用乙個classa。clr的型別檢查增強了安全性,但也會對效能造成一定的影響。這是因為clr首先必須判斷(obj)引用的物件的實際型別。然後clr必須遍歷繼承層次結構,用每個基型別去核對指定的型別(classa)。

實際系統開發中,這是乙個相當常用的程式設計模式,於是c#有了操作符as。

as與is做差不多的事情,型別顯式強制轉換。

as操作符的工作方式與強制型別轉換一樣,只是它永遠不會丟擲乙個異常——相反,如果物件不能轉換,結果就是null。

但as有其不同的地方,簡化**,同時提公升效能。

請看示例**: 

object obj=new object(); 

classa a= obj  as classa;

if(a!=null)  //在if判斷a是否為null

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

如果obj不相容classa型別,as操作符會返回null。

因此,as操作符使clr只檢驗一次物件的型別。

if語句只是檢查a是否為null。這個檢查的速度比檢驗物件的型別快得多。

所以正確做法是檢查最終生成的引用是否為null。如果企圖直接使用最終生成null的引用,會丟擲乙個 nullreferenceexception異常。

示例**:

object obj=new object(); //建立乙個object物件.

classa a =obj as classa;//將obj轉型為classa,此時轉型操作會失敗,不會丟擲異常,但a會被設為null.

a.tostring();//訪問a會丟擲乙個nullreferenceexception異常。 

對比C 中 與equal方法

c 中equal與 的區別 收藏 對於值型別,如果物件的值相等,則相等運算子 返回 true,否則返回 false。對於string 以外的引用型別,如果兩個物件引用同乙個物件,則 返回 true。對於 string 型別,比較字串的值。操作比較的是兩個變數的值是否相等。equals 方法比較的是兩...

python與c 的對比

一位正在學校做課程設計題目,要求在乙個檔案中找到給定單詞出現的位置並統計出現次數。這是乙個比較簡單的文字處理問題,於是,我給他用 python 寫了乙個,並打賭在5分鐘內用不到30行程式解決問題。我作到了,下面是程式 if name main file name raw input input th...

C 與 LUA 的經驗對比

1,字串遍歷不同處 例 str 漢字abcabc c 可以使用str i 取得字串中的漢字字元和拼音字元 str 0 漢 str 1 字 str 2 a 依次類推。lua中 str 1 nil str 2 nil 全為nil,語法不支援這樣的下標功能,只有string.byte str,i 來取得某...