[轉載]C#中as和is關鍵字的用法

来源:http://www.cnblogs.com/Scl891004X/archive/2016/11/24/6098827.html
-Advertisement-
Play Games

這篇文章主要介紹了C#中AS和IS關鍵字的用法的相關資料,需要的朋友可以參考下 ...


這篇文章主要介紹了C#中as和is關鍵字的用法的相關資料,需要的朋友可以參考下。 原文鏈接:http://www.jb51.net/article/80944.htm#comments 

在程式中,進行類型轉換是常見的事,C#支持基本的強制類型轉換方法,例如:

1 Object obj1 = new NewType(); 
2 NewType newValue = (NewType)obj1; 

這樣強制轉換的時候,這個過程是不安全的,因此需要用try-catch語句進行保護,這樣一來,比較安全的代碼方式應如下所示:

Object obj1 = new NewType(); 
NewType newValue = nulltry
{ 
  newValue = (NewType)obj1; 
} 
catch (Exception err) 
{ 
  MessageBox.Show(err.Message); 
} 

但是上面的寫法在C#中已是過時的寫法,也是比較低效的寫法,比較高效且時尚的寫法是用as操作符,如下:

1 Object obj1 = new NewType(); 
2 NewTYpe newValue = obj1 as NewType;

安全性:

as操作符不會做過多轉換操作,當需要轉化對象的類型屬於轉換目標類型或者轉換目標類型的派生類型時,那麼此轉換操作才能成功,而且並不產生新的對象【當不成功的時候,會返回null】。因此用as進行類型轉換是安全的。

效率:

當用as操作符進行類型轉換的時候,首先判斷當前對象的類型,當類型滿足要求後才進行轉換,而傳統的類型轉換方式,是用當前對象直接去轉換,而且為了保護轉換成功,要加上try-catch,所以,相對來說,as效率高點。
需要註意的是,不管是傳統的還是as操作符進行類型轉換之後,在使用之前,需要進行判斷轉換是否成功,如下:

1 if(newValue != null2 { 
3 //Work with the object named “newValue“ 
4 } 

但是,使用as操作符要註意以下幾點:

1、不用在類型之間進行類型轉化,即如下編寫就會出現編譯錯誤:

1 NewType newValue = new NewType(); 
2 NewTYpe1 newValue = newValue as NewTYpe1; 

2、不能應用在值類型數據,即不能如下寫(也會出現編譯錯誤):

1 Object obj1 = 112 int nValue = obj1 as int; 

對於1.,可以用傳統的類型轉換方式完成:

1 NewTypeOne newTestOne = new NewTypeOne(); 
2 NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne; 

要想使上面的操作正確完成,在原有類型中增加類型轉換操作符函數,即需要完成類似如下的代碼:

1 public calss NewTypeOne 
2 {
3   public static explicit operator NewTypeTwo( NewTypeOne obj1) 
4   { 
5   //Convert object into new type 
6   } 
7 } 

對於2,在C#中可以使用is操作符,再加上老式的類型轉換操作,就可以安全完成轉換,要完成如上操作,正確的寫法如下:

1 Object obj1 = 112 if(objTest is int3 { 
4   int nValue = (int)obj1; 
5 } 

在C#中提供的很好的類型轉換方式總結為:

Object => 已知引用類型——使用as操作符完成;

Object => 已知值類型——先使用is操作符來進行判斷,再用類型強轉換方式進行轉換;

已知引用類型之間轉換——首先需要相應類型提供轉換函數,再用類型強轉換方式進行轉換;

已知值類型之間轉換——最好使用系統提供的Conver類所涉及的靜態方法。

下麵給大家介紹下C#中關於as關鍵字的使用

我們在實際編碼中有時會用到as關鍵字來將對象轉換為指定類型,與is類型不同的是,is關鍵字是用於檢查對象是否與給定類型相容,如果相容就返回true,如果不相容就返回false。而as關鍵字會直接進行類型轉換,如果轉換成功會返迴轉換後的對象,如果轉換不成功則不會拋出異常而是返回null。

下麵我們創建一個簡單的用例來闡述as的用法:

1.以visual studio2015為開發環境,新建一個window Form窗體應用程式,並將其命名為TransForm.

2.向窗體中添加一個button控制項,用於類型轉換,再添加一個GroupBox控制項,向此控制項中添加三個RadioButton控制項,分別用於選擇哪種類型。

3.詳細代碼如下:

 1  private void btn_Get_Checked(object sender,EventArgs e) 
 2 { 
 3    if(rbtn_object.checked) 
 4    { 
 5      using (FileStream P_filestream=new FileStream(@'d:\log.txt',System.IO.FileMode.Create)) 
 6      { 
 7        object p_Object = P_filestream as object;
 8         if(p_Object!=null)
 9        { 
10         Message.Box("轉換Obejct成功""提示"); 
11        } 
12        else
13        { 
14         Message.Box("轉換Obejct失敗","提示!");
15        } 
16      }
17   } 
18    if(rbtn_stream.checked) 
19    { 
20      using (FileStream P_filestream=new FileStream(@'d:\log.txt',System.IO.FileMode.Create)) 
21      { 
22        obejct p_object=P_filestream; 
23        Stream P_Stream = p_objec as Stream; 
24        if(P_Stream!=null) 
25        { 
26          Message.Box("轉換Stream成功""提示"); 
27        } 
28        else
29        { 
30          Message.Box("轉換Stream失敗","提示!");
31        } 
32      } 
33    } 
34  } 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 若虛擬機在不正常關機的時候會遇到如下圖所示的問題:先點擊“取消”按鈕 解決方法:打開“資源管理器”,進入到彈出提示視窗所在的路徑(即H:\VMware\Virtual Machines Documents\CentOS),在這裡找到CentOS.vmx.lck文件夾,然後將尾碼名.lck的文件夾刪除 ...
  • 1.參照Zabbix文檔配置 依照官方文檔配置,沒什麼說的。 zabbix官方文檔:https://www.zabbix.com/documentation/3.2/manual/vm_monitoring 2.遇到的問題 這裡主要介紹我遇到的問題。由於理解偏差,文檔中的sdk,我以為是sdk的意思... ...
  • 問題 怎麼樣可以使用更貼近資源(Controller,Action)的方式定義路由。 解決方案 可以使用屬性路由直接在資源級別聲明路由。只要簡單的在 Action 上使用屬性路由 RouteAttribute,然後傳一個相關路由模板就可以。屬性路由與集中式路由在路由模板含義上基本是一樣的,所有路由參 ...
  • 在對ASP.NET Core管道中關於依賴註入的兩個核心對象(ServiceCollection和ServiceProvider)有了足夠的認識之後,我們將關註的目光轉移到編程層面。在ASP.NET Core應用中基於依賴註入的編程主要涉及到兩個方面,它們分別是將服務註冊到ServiceCollec... ...
  • 本月16號,MS發佈了 .NET Core 1.1。作為一個用貫MS產品的小盆友,我第一時間就把相關的安裝包下載下來了,然後果斷安裝(入坑)。 我猜你來看這篇博客可能遇到了和我一樣的問題。 問題0:正確的安裝順需 正確的順序在MS的dotnet Core官網上可以找到,請根據自己的VS版本對號入座。 ...
  • 本文版權歸博客園和作者吳雙本人共同所有,轉載和爬蟲請註明原文地址: www.cnblogs.com/tdws 寫在前面 在後臺介面開發中,介面文檔是必不可少的。在複雜的業務當中和多人對接的情況下,簡單的介面文檔又不能滿足需求,試想你的單應用後臺有幾十個模塊,幾百甚至更多的介面,又有上百個ViewMo ...
  • 一、ASP.NET 中的 Web API [水煮 ASP.NET Web API2 方法論](1-1)在MVC 應用程式中添加 ASP.NET Web API 與 ASP.NET MVC 在同一個進程中使用 ASP.NET WEB API [水煮 ASP.NET Web API2 方法論](1-2) ...
  • 這幾天在Python程式員的微信訂閱號中總是見到yield的關鍵字,才想起來在C#中也是有yield,但是只是知道有,從來沒有瞭解過他的用法,今天有時間就來看看是怎麼使用的。剛開始肯定就是搜索一下用法了,找到兩篇說明示例,一是 C# 中的"yield"使用,第二個是MSDN的官方api yield( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...