【深入.NET平臺】淺談.NET Framework基元類型

来源:http://www.cnblogs.com/LY2016start/archive/2016/09/29/5922387.html
-Advertisement-
Play Games

什麼是基元類型? 什麼是基元類型? 初學者可能很少聽說過這個名詞,但是平時用得最多的肯定是基元類型。先看下麵兩行代碼: 上面兩行代碼都表示聲明一個int類型的變數,但在平時寫代碼的時候我們一般用的是第二種方式。第二種方式不僅簡潔、易讀,而且生成的IL代碼和第一種完全一致。像這種編譯器直接支持的數據類 ...


  • 什麼是基元類型?

初學者可能很少聽說過這個名詞,但是平時用得最多的肯定是基元類型。先看下麵兩行代碼:

System.Int32 a = 5;
int a = 5

       上面兩行代碼都表示聲明一個int類型的變數,但在平時寫代碼的時候我們一般用的是第二種方式。第二種方式不僅簡潔、易讀,而且生成的IL代碼和第一種完全一致。像這種編譯器直接支持的數據類型就稱為基元類型。類似的還有double、bool、long、string等。

  • 基元類型與.NET框架類庫的關係

      在我接觸的第一份面試題中,我記得有這麼一道題目:請談談C#中string和String的區別?

      我當時確實懵逼了,有區別嗎?好像用的時候完全沒有區別。其實二者說有區別也可以,說沒區別也沒錯。因為基元類型sting直接映射到FCL中的String類型。所以本質上他倆是同一個東西。

  在C#中,基元類型都直接映射到.NET框架類庫中存在的類型。之前看了一本書,關於這種映射有一種解釋:

using string = System.String;

  從這個角度可以認為,C#編譯器假定所有源文件都添加了using指令。

  下麵列舉C#基元類型在FCL中對應的類型:

 C#基元類型  FCL類型  符合CLS  說明
 sbyte  System.SByte  否  有符號8位整數
 byte  System.Byte  是  無符號8位整數
 short  System.Int16  是  有符號16為整數
 ushort  System.UInt16  否  無符號16位整數
 int  System.Int32  是  有符號32位整數
 uint  System.UInt32  否  無符號32位整數
 long  System.Int64  是  有符號64位整數
 ulong  System.UInt64  否  無符號64位整數
 char  System.Char  是  16位Unicode字元
 float   System.Single  是  32位浮點數 
 double   System.Double  是  64位浮點數 
 bool   System.Boolean  是   true/false值
 string   System.String  是   字元數組 
 object   System.Object  是   所有類型的基類型 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FCL中只要符合公共語言規範(CLS)的類型,其他語言都提供了類似的基元類型,但是不符合CLS的類型,其他語言就不一定支持了。

  • 基元類型的使用

C#編譯器支持與類型轉換、字面值以及操作符有關的模式。

首先,編譯器能執行基元類型之間的隱式或顯示轉換,例如: 

int a = 5;    //從Int32隱式轉換為Int32
long b = a;    //從Int32隱式轉換為Int64
byte d = (byte)a;   //從Int32顯示轉換為Byte  
short e = (short)a;    //從Int32顯示轉換為Int16

       System.Int64與System.Int32是不同的類型,而且不存在派生關係。那麼他們之間為什麼能隱式轉換呢?原因是C#編譯器非常熟悉基元類型,會在編譯代碼時應用自己的特殊規則。也就是說,編譯器能識別常見的編程模式。

       但是,只有在轉換安全的情況下,C#才允許隱式轉換。所謂的安全是指不會發生數據丟失的情況。比如Int32轉換為Int64。但如果可能不安全,C#就要求顯示轉換。對於數值類型,不安全意味著轉換後可能丟失精度或數量級。例如Int32轉Byte,Int32表示有符號32位二進位數,最大值為:2^16-1,而Byte表示無符號8位二進位數,最大值為:2^8-1,所以大的Int32可能丟失精度。

  除了轉型,基元類型還能寫成字面值。字面值可以堪稱基元類型本身的實例。所以可以調用實例方法,例如:

string a = 123.ToString();    //Int32實例123調用ToString()方法

  此外,如果表達式由字面值構成,編譯器在編譯時就能完成表達式求值,例如:

int a = 100+20+3;    //生成的代碼將a的值設為123
string b = "a"+"bc";    //生成的代碼將b的值設為“abc”

  最後,編譯器知道如何和以什麼順序解析代碼中的基元類型和操作符之間的運算,例如:

int a = 5;    //賦值操作
int b = a + 10;    //加和賦值操作
bool c = (a<0);    //小於和賦值操作

 

 


 

參考文獻:CLR via C#(第四版)

 

PS:新手正在學習.NET Framework,有什麼錯誤希望各位指正!

 


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

-Advertisement-
Play Games
更多相關文章
  • 安裝完成後,在“控制面板”中啟動“添加刪除程式”,選中Vs2008,點擊“更改、刪除”,輸入序列號:PYHYP-WXB3B-B2CCM-V9DX9-VDY8T ...
  • 本來沒打算單獨寫的,但是在自己弄測試小程式的時候,越寫發現不清楚的東西越多,所以實踐又一次證明:紙上得來終覺淺,絕知此事要躬行! 直接貼代碼了: 另外:祝大家國慶節快樂!我也要去參加一起長大的哥哥的婚禮了啊......時間啊,就是這麼匆匆溜走不回頭的....... ...
  • 引言 小弟工作過2家小作坊!項目經理使用的框架都是基於EF的Repository(倉儲)設計模式,我想說這種模式根本就是錯誤的使用! 更可怕的是博客園裡面也有很多這種教程! 之所以說錯誤的!是因為EF本身就是Repository(倉儲)的設計! 何必再套一層包裹給自己找事?而且也套的醜陋無比! 讓我 ...
  • VSCode,安裝插件:C# for Visual Studio Code (powered by OmniSharp),關於C#代碼的插件提示後,提示安裝DotNetCore.1.0.1 在安裝DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出現0x80072f8... ...
  • 這個屬性我們平時可能並不怎麼用.先來看下MSDN上的解釋: 解釋的非常專業,然而我並沒有看懂. 說說我的理解吧:把這個屬性設置為false,看起來沒有變化,但操作上已經把他完全忽視了,不觸發事件,可以直接點到它下麵的東西. 這個屬性能方便的解決工作中常見的麻煩,比如下麵這個例子: 註意上面那部分.效 ...
  • 轉自:http://blog.csdn.net/samsone/article/details/7556781 1、格式化貨幣(跟系統的環境有關,中文系統預設格式化人民幣,英文系統格式化美元) string.Format("{0:C}",0.2) 結果為:¥0.20 (英文操作系統結果:$0.20) ...
  • 前段時間,我負責一款APP的介面開發,其中有一個新增的操作,邏輯比較複雜,涉及到9個數據表的數據改動,而且表又跨庫,這9個表呢,個別在別處還有單表操作,所以為了復用之前的數據層,筆者直接想到了使用分散式事務TransactionScope,在業務層直接調用多個DAO類的方法。 再說下這個新增操作吧, ...
  • 之前一直認為因為List內部實現是數組,ToArray的實現只是將數組返回出去而已。 今天測了一下發現並不是那樣 1萬數量大小的List,調用1萬次ToArray的時間消耗是417ms左右。 報著疑惑看了下源碼,沒想到它是把內部數組複製了一份再返回 看來對於重覆性操作,可以考慮直接緩存成全局變數,或 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...