亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

CLRviaC#深解筆記二-類型設計

2019-11-14 13:39:48
字體:
來源:轉載
供稿:網友
類型基礎
所有類型都從System.Object派生
 
CLR要求所有對象都用new 操作符來創建。
Employee e = new Employee("Constructor Parameters");
 
以下是 new 操作符所做的事情:
#1, 計算類型及所有基類型(一直到System.Object, 雖然它沒有定義自己的實例字段)中定義的所有實例字段需要的字節數。
堆上的每個對象還需要一些額外(overhead 開銷成員)的成員 -- 即“類型對象指針”(type object pointer)和“同步塊索引”(sync block index)。這些成員由CLR用于管理對象。這些額外成員的字節數會計入對象大小。
#2, 它從托管堆中分配指定類型要求的字節數,從而分配對象的內存,分配的所有字節都設為0。
#3, 它初始化對象的“類型對象指針”和“同步塊索引”成員。
#4, 調用類型的實例構造器,向其傳入在對new 的調用中指定的任何實參。大多數編譯器都在構造器中自動生成代碼來調用一個基類構造器。每個類型的構造器在調用時,都要負責初始化由這個類型定義的實例字段。最總調用的是System.Object的構造器,該構造器只是簡單地返回,不會做其他任何事情。
new執行了所有操作之后,會返回指向新建對象一個引用(或指針)。在前面的示例代碼中,這個引用會保存到變量e中,后者具有Employee類型。
 
類的“新實例”和“實例成員”:兩種不同的“實例”。一種是類的實例,也就是具體的對象。另一種是類中定義的實例字段。所謂“實例字段”,就是指非靜態字段,有時也稱為“實例成員”。簡單地說,實例成員是屬于類的對象的,
而靜態成員是屬于類的。
 
類型安全
CLR總是知道一個對象(某個類型的實例)是什么類型。所有表達式都解析成某個類型的實例,在編譯器生成的代碼中,只會執行對這個類型來說有效的操作。與非類型安全的語言相比,類型安全的語言的優勢在于:程序員會犯的許多錯誤能在編譯時檢測到,確保代碼在你的嘗試執行它之前是正確的。除此之外,編譯時語言通常能生成更小、更快的代碼,因為他們能在編譯時進行更多的假設,并在生成的IL和元數據中落實那些假設。
 
類型轉換
CLR最重要的特性之一就是類型安全性。在運行時,CLR總是知道一個對象是什么類型。調用GetType() 方法,總是知道一個對象確切的類型是什么。
開發中,開發人員會經常將一個對象從一種類型轉換為其他各種類型。CLR允許將一個對象轉換為它的(實際)類型或者它的任何基類型。
#1: 向基類型的轉換被認為是一種安全的隱式轉換。
#2: 將對象轉換為它的某個派生類型時,C#要求只能進行顯式轉換,因為這樣的轉換有可能在運行時失敗。在運行時,CLR檢查類型操作,確定總是轉換為對象的實際類型或者它的任何基類型。
 
這就是類型安全的設計。如果CLR允許這樣的轉型,就無類型安全性可言了,將出現難以預料的結果 -- 其中包括應用程序崩潰,以及安全漏洞的出現(因為一種類型能輕松地偽裝成另一種類型)。
類型偽裝是許多安全漏洞的根源,它還會破壞應用程序的穩定性和健壯性。類型安全是CLR一個重要的目標。
 
is 操作符,檢查一個對象是否兼容于指定的類型,并返回一個Boolean值;true或false。注意 is 操作符永遠不會拋出異常。如果對象引用是null,is操作符總是返回false。
 
Object o = new Object();
if (o is Employee)
{
     Employee e = (Employee)o;
}
 
這段代碼中,CLR實際上會檢查兩次對象的類型。
CLR 的類型檢查增強了安全性,但無疑也會對性能造成一定影響。因為CLR首先必須判斷變量引用的對象的實際類型。然后,CLR必須遍歷繼承層次結構,用每個基類型去核對指定的類型(如Employee)。
上面這個事一個相當常用的編程模式,所以C#專門提供了as操作符,目的就是簡化這種代碼的寫法,同時提升性能。
 
Employee e = o as Employee;
if(e != null)
{
     //.....
}
 
as 操作符的工作方式與強制類型轉換一樣,只是它永遠不會拋出一個異常 -- 相反,如果對象不能轉型,結果就是null。所以,正確做法也就是檢查最終生成的引用是否為null。應該不要直接使用最終生成的引用,否則可能會拋出一個System.NullReferenceException 異常。
 
注意:C#允許在一個類型中定義轉換操作符方法。只有在使用一個轉型表達式時,才會調用這些方法;使用C#的as或者is操作符時,永遠不會調用他們。
 
命名空間 (namespace)
用于對相關的類型進行邏輯性分組,開發人員可以使用命名空間方便地定位一個類型。例如,System.Text命名空間定義了一組執行字符串處理的類型。
using 指令指示編譯器為每一個類型附加不同的前綴,直到找到一個匹配項。using的使用,不僅極大地減少打字量,還有助于增強代碼的可讀性。
using指令還支持另一種形式,允許為一個類型或者命名空間創建別名。如果只想使用一個命名空間中的少數幾個類型,不希望它的所有類型都跑出來“污染”全局命名空間,別名就顯得十分方便。
 
using System;
using jack = CSI.Widget;
 
重要提示:CLR并不知道命名空間的任何事情。訪問一個類型時,CLR需要直到類型的完整名稱(可能是一個相當長的、包含句點符號的名稱)以及該類型的定義具體在哪一個程序集中。這樣一來,“運行時”才能加載正確的程序集,找到目標類型,并對其進行操作。
 
編譯器會掃描引用的所有程序集,在其中查找類型的定義。一旦找到正確的程序集,程序集信息和類型信息就會嵌入最終生成的托管模塊的元數據中。為了獲取程序集信息,必須將定義了“引用的類型”的程序集傳給編譯器。
默認情況下,C#編譯器會自動在MSCorLib.dll 程序集中查找 “引用的類型”,即使你沒有顯式告訴它這樣做。MSCorLib.dll程序集中包含了所有核心Framework類庫(FCL)類型的定義,比如Object, Int32, String等。
 
命名空間和程序集(實現了一個類型的文件)不一定是相關的。特別是,同一個命名空間中的各個類型可能是在不同的程序集中實現的。在一個程序集中,也可能包含不同命名空間中的類型。
 
運行時的相互關系
 
類型、對象、線程棧和托管堆在運行時的相互關系。調用靜態方法、實例方法和虛方法的區別。
 
 
已經加載了CLR的一個Microsoft Windows 進程。這個進程中,可能存在多個線程。一個線程的創建時,會分配到一個1MB大小的棧。這個棧的空間用于向方法傳遞實參,并用于方法內部定義的局部變量。棧是從高位內存地址向低位內存地址構建的。
 
 
棧幀(stack frame)代表的是當前線程的調用棧中的一個方法調用。在執行線程的過程中進行的每個方法的調用都會在調用棧中創建并壓入一個stack frame
 
  
 
 
 
 
 
 
 
至此我們討論了源代碼、IL和JIT編譯的代碼之間的關系,還討論了線程棧、實參、局部變量以及這些實參和變量如何引用托管堆上的對象。我知道了,對象中包含一個指針,它指向對象的類型對象(類型對象中包含靜態字段和方發表)。
還討論了JIT編譯器如何決定靜態方法、非虛實例方法以及虛實例方法的調用方式。這一切的理解,可以幫助深刻地認識CLR的工作方式。
 
注意,Employee和Manager類型對象都包含“類型對象指針”成員。這是由于類型對象本質上也是對象。CLR創建類型對象時,必須初始化這些成員。初始化成什么呢?CLR開始在一個進程中運行時,會立即為MSCorLib.dll中定義的System.Type類型創建一個特殊的類型對象。Employee和Manager類型對象都是該類型的“實例”。因此,它們的類型對象指針成員會初始化成對System.Type類型對象的引用,如下面所示。
 
 
-----------------------------------------------------------
 

上一篇:asp.net分頁的制作

下一篇:DNX概述

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕精品国产| 久久精品91久久久久久再现| 国内精品久久久久影院 日本资源| 97精品久久久| 日韩精品在线视频美女| 亚洲精品成人av| 国产玖玖精品视频| xxxx性欧美| www.久久撸.com| 91精品国产高清久久久久久久久| 亚洲欧美日韩另类| 欧美日韩国产精品| 欧美黑人性生活视频| 激情成人中文字幕| 欧美黄网免费在线观看| 欧美肥婆姓交大片| 久久在精品线影院精品国产| 久久国产天堂福利天堂| 青青a在线精品免费观看| 欧美精品第一页在线播放| 日韩**中文字幕毛片| 亚洲国产99精品国自产| 91久久精品国产91久久性色| 国产精品v日韩精品| 日韩小视频在线观看| 国产精品男人的天堂| 久久精品小视频| 久久精品国产久精国产思思| 92看片淫黄大片看国产片| 欧美日韩国产精品一区二区不卡中文| 国产日产久久高清欧美一区| 91香蕉嫩草影院入口| 亚洲日本欧美日韩高观看| 黑人精品xxx一区| 亚洲国产天堂久久综合| 亚洲国产成人久久综合一区| 久久久国产视频| 精品美女永久免费视频| 亚洲伦理中文字幕| 国产不卡在线观看| 欧美一区亚洲一区| 秋霞av国产精品一区| 精品中文字幕久久久久久| 98精品国产自产在线观看| 欧美日韩亚洲网| 欧美成人免费视频| 国产精品成人一区| 久久久精品影院| 成人欧美一区二区三区黑人孕妇| 欧美性猛交xxxx免费看久久久| 日韩美女视频免费看| 92福利视频午夜1000合集在线观看| 亚洲黄色免费三级| 欧美精品video| 欧美精品在线第一页| 亚洲香蕉伊综合在人在线视看| 曰本色欧美视频在线| 国产精品a久久久久久| 日本精品一区二区三区在线播放视频| 亚洲国产中文字幕久久网| 午夜精品久久久久久久男人的天堂| 成人欧美一区二区三区黑人| 黄色成人在线播放| 欧美福利视频网站| 国产精品夜间视频香蕉| 国产成人精品一区二区三区| 亚洲热线99精品视频| 国产欧美日韩高清| 亚洲精品理论电影| 日韩av观看网址| 国产精品第一页在线| 伊人伊人伊人久久| 一区二区三区视频免费在线观看| 理论片在线不卡免费观看| 亚洲人成亚洲人成在线观看| 91高清免费视频| 最近更新的2019中文字幕| 在线观看视频99| 色系列之999| 成人免费在线视频网址| 91在线看www| 91久久精品美女| 久久精品国产2020观看福利| 日韩免费精品视频| 欧美二区在线播放| 日本伊人精品一区二区三区介绍| 欧美国产日韩视频| 国产99视频精品免视看7| 久久久精品视频成人| 国产精品影片在线观看| 国产第一区电影| 欧美日韩成人免费| 亚洲最大在线视频| 日韩av网址在线观看| 亚洲男人天堂2024| 国产精品一久久香蕉国产线看观看| 欧美xxxx做受欧美.88| 亚洲欧美国产制服动漫| 国产拍精品一二三| 国产精品成人va在线观看| 国产成人精品久久亚洲高清不卡| 91亚洲精品久久久| 性欧美视频videos6一9| 欧美一区二区三区……| 国产精品久久久久久久av大片| 中文字幕在线日韩| 97精品国产97久久久久久| 欧美xxxx18国产| 日韩亚洲成人av在线| 岛国av一区二区三区| 国产精品久久久久久久av电影| 久久这里只有精品99| 欧美资源在线观看| 日韩三级影视基地| 色噜噜亚洲精品中文字幕| 日韩网站在线观看| 中文字幕日韩精品在线观看| 国产精品99久久久久久白浆小说| 久久91精品国产91久久跳| 久久人体大胆视频| 欧美日韩国产精品一区| 中文字幕欧美亚洲| 亚洲夜晚福利在线观看| 欧美午夜性色大片在线观看| 午夜精品在线观看| 成人免费午夜电影| 成人国产精品av| 日韩欧美国产一区二区| 国产精品久久电影观看| 久久在线视频在线| 成人写真福利网| 欧美日韩国产在线看| 日本国产高清不卡| 日本免费一区二区三区视频观看| 国产精品久久一区主播| 2019中文在线观看| 高清视频欧美一级| 久久av红桃一区二区小说| 疯狂做受xxxx欧美肥白少妇| 91精品国产免费久久久久久| 日韩**中文字幕毛片| 国产成人综合av| 亚洲天堂日韩电影| 91美女片黄在线观| 久久成人18免费网站| 久久这里有精品| 97在线免费观看视频| 久久久99久久精品女同性| 欧美老女人xx| 欧亚精品中文字幕| 久久影视电视剧免费网站| 国产福利视频一区二区| 欧美第一页在线| 国产一区欧美二区三区| www.日本久久久久com.| 国产一区二区三区在线播放免费观看| 国产有码在线一区二区视频| 亚洲精品视频免费在线观看| 久久精品视频亚洲| 亚洲成人三级在线| 狠狠色噜噜狠狠狠狠97| 一夜七次郎国产精品亚洲| 亚洲www永久成人夜色| 久久久久久久成人|