C# new關鍵字和對象類型轉換(雙括號、is操作符、as操作符)

一、new關鍵字

CLR要求所有的對象都通過new來創建,代碼如下:

Object obj=new Object();

以下是new操作符做的事情

1、計算類型及其所有基類型(一直到System.Object,雖然它沒有定義自己的實例字段)中定義的所有實例字段需要的字節數.堆上每個對象都需要一些額外的成員,包括“類型對象指針”和"同步索引塊"。CLR利用這些成員管理對象.額外成員的字節數要計入對象的大小.

2、從托管堆中分配類型要求的字節數,從而分配對象的內存,分配的所有字節都設為0

3、初始化對象的"類型對象指針"和"同步索引塊"成員

4、調用類型的實例構造器,傳遞在new調用中指定的實參,大多數編譯器都在構造器中自動生成代碼來調用基類構造器,每個類型的構造器都負責初始化該類型定義的實例字段.最終調用System.Object的構造器,該構造器什么都不做.

注:沒有和new操作符對應的delete操作符,換言之,沒有辦法顯示釋放為對象分配的內存.CLR采用了垃圾回收機制,能自動檢測到一個對象不在被使用或者訪問,并自動釋放對象的內存.

?

二、對象類型轉換

1、基礎知識

CLR最重要的特性之一就是類型安全.在運行時,CLR總能知道當前對象是什么類型,調用GetType方法即可知道當前對象是什么類型,由于GetTpye是非虛方法,所以一個類型不能偽裝成另一個類型.例如Employee類型不能重寫GetType方法來返回一個SuperHero類型.

但是,日常開發中,經常需要將一種類型轉換成另一種類型,CLR允許將對象轉換成其實際類型或者它的任何基類型.每種編程語言都規定了開發人員具體如何進行這種轉換.C#不要求任何特殊語法即可將對象轉換成它的基類型,因為向基類型轉換被認為是一種類型安全的轉換.

對象轉換成基類型的代碼如下:

    public class Program{static void Main(string[] args){//因為CLR中,Object是所有類型的基類,所以不需要轉型Object obj = new Person();}}internal class Person { }

然而將一個對象轉換成其派生類型(也就是子類型)時,C#要求進行顯式的轉換,因為這種轉換可能會在運行時失敗!

將對象轉換成其派生類型(子類型),代碼如下:

    public class Program{static void Main(string[] args){//因為CLR中,Object是所有類型的基類,所以不需要轉型Object obj = new Person();//需要強制轉換,因為Person派生自ObjectPerson p = (Person)obj;}}internal class Person { }

注:進行強制轉換的對象必須是接收類型的派生類型,如果不是,編譯器會報System.InvalidCastException異常.

2、使用is和as來進行強制轉換

(1)、is操作符

C#中進行類型轉換的另一種方式是使用is操作符,is檢查對象是否兼容于指定類型,返回boolean值true或者false,注意:is操作符永遠不拋出異常,代碼如下:

    public class Program{static void Main(string[] args){Object obj = new Object();Console.WriteLine(obj is Person);Person p = new Person();Console.WriteLine(p is Person);Console.ReadKey();}}internal class Person { }  

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

if (stu is Person)
{Person p = (Person)stu;
}

在上述的代碼中,CLR實際進行了兩次的代碼檢查,is操作符首先核實stu是否兼容于Person類型,如果是,在if語句內部轉型時,CLR再次核實stu是否引用一個Person類型,CLR的類型檢查增強了安全性,但無疑會對性能造成一定的影響,應為CLR首先必須去判斷變量引用的實際類型,用每個基類型去核對指定的類型.

2、as操作符

為了簡化is操作符的做法,同時提供is操作符的性能,C#專門提供了as操作符,as操作符的工作方式與強制類型轉換一樣,只是它永遠不拋出異常,如果對象不能轉換,結果就是null.所以正確使用as操作符的做法是檢查轉型結果是否為null,如果直接使用這個結果可能會拋出System.NullReferenceException異常,代碼如下:

    public class Program{static void Main(string[] args){Object obj = new Object();Person p = obj as Person;//這個轉換會失敗,但是p會被設為null,不拋出異常string exceptionInfo = p.ToString();//這里訪問p會拋出異常
            Console.WriteLine(exceptionInfo);Console.ReadKey();}}internal class Person { }?

? ?

轉載于:https://www.cnblogs.com/GreenLeaves/p/7905787.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDBC01 利用JDBC連接數據庫【不使用數據庫連接池】

目錄: 1 什么是JDBC 2 JDBC主要接口 3 JDBC編程步驟【學渣版本】 5 JDBC編程步驟【學神版本】 6 JDBC編程步驟【學霸版本】 1 什么是JDBC JDBC是JAVA提供的一套標準連接數據庫的接口,規定了連接數據庫的步驟和功能;不同的數據庫提供商提供了一…

leetcode 778. 水位上升的泳池中游泳(并查集)

在一個 N x N 的坐標方格 grid 中,每一個方格的值 grid[i][j] 表示在位置 (i,j) 的平臺高度。 現在開始下雨了。當時間為 t 時,此時雨水導致水池中任意位置的水位為 t 。你可以從一個平臺游向四周相鄰的任意一個平臺,但是前提是此時水位必須…

2020年十大幣預測_2020年十大商業智能工具

2020年十大幣預測In the rapidly growing world of today, when technology is expanding at a rate like never before, there are plenty of tools and skills to explore, learn, and master. In this digital and data age, Business Information and Intelligence have cl…

如何使用MySQL和JPA使用Spring Boot構建Rest API

Hi Everyone! For the past year, I have been learning JavaScript for full-stack web development. For a change, I started to master Java — the powerful Object Oriented Language.嗨,大家好! 在過去的一年中,我一直在學習用于全棧W…

翻譯

令 $m>n>1$ 為正整數. 一個集合含有 $m$ 個給定的實數. 我們從中選取任意 $n$ 個數, 記作 $a_1$, $a_2$, $\dotsc$, $a_n$, 并提問: 是否 $a_1<a_2<\dotsb < a_n$ 正確? 證明: 我們可以最多問 $n!-n^22n-2m(n-1)(1\lfloor \log_{n} m \rfloor)-m$ 個問題&#…

720 智能硬件與 LeanCloud 云端的默契協作

【 玩轉 LeanCloud 】開發者經驗分享&#xff1a; 作者&#xff1a;謝子超 720技術負責人&#xff0c;從業十余年&#xff0c;一直負責軟件開發工作。 我們的產品是與監控和改善室內空氣質量相關的智能硬件&#xff0c;我們使用 LeanCloud 平臺已經有 2 年多了&#xff0c;借此…

linux cifs windows 慢,windows上使用dockerIO特別慢有沒有更優的解決方案?

復制一個大佬的回答Docker for Windows是在Hyper-V虛擬機上跑Linux&#xff0c;文件掛載是通過SMB協議從Windows掛載到Linux&#xff0c;文件讀寫都經過網絡&#xff0c;遇到Laravel這種每次啟動就要加載幾百個文件的框架&#xff0c;文件性能問題就尤其明顯。最好的驗證方法就…

編譯原理—詞法分析器(Java)

1.當運行程序時&#xff0c;程序會讀取項目下的program.txt文件 2. 程序將會逐行讀取program.txt中的源程序&#xff0c;進行詞法分析&#xff0c;并將分析的結果輸出。 3. 如果發現錯誤&#xff0c;程序將會中止讀取文件進行分析&#xff0c;并輸出錯誤提示 所用單詞的構詞規…

【BZOJ4653】[Noi2016]區間 雙指針法+線段樹

【BZOJ4653】[Noi2016]區間 Description 在數軸上有 n個閉區間 [l1,r1],[l2,r2],...,[ln,rn]。現在要從中選出 m 個區間&#xff0c;使得這 m個區間共同包含至少一個位置。換句話說&#xff0c;就是使得存在一個 x&#xff0c;使得對于每一個被選中的區間 [li,ri]&#xff0c;都…

為什么我們需要使用Pandas新字符串Dtype代替文本數據對象

We have to represent every bit of data in numerical values to be processed and analyzed by machine learning and deep learning models. However, strings do not usually come in a nice and clean format and require a lot preprocessing.我們必須以數值表示數據的每…

遞歸方程組解的漸進階的求法——代入法

遞歸方程組解的漸進階的求法——代入法 用這個辦法既可估計上界也可估計下界。如前面所指出&#xff0c;方法的關鍵步驟在于預先對解答作出推測&#xff0c;然后用數學歸納法證明推測的正確性。 例如&#xff0c;我們要估計T(n)的上界&#xff0c;T(n)滿足遞歸方程&#xff1a;…

【轉載】C# 理解泛型

術語表 generics&#xff1a;泛型type-safe&#xff1a;類型安全collection: 集合compiler&#xff1a;編譯器run time&#xff1a;程序運行時object: 對象.NET library&#xff1a;.Net類庫value type: 值類型box: 裝箱unbox: 拆箱implicity: 隱式explicity: 顯式linked list:…

javascript 作用_JavaScript承諾如何從內到外真正發揮作用

javascript 作用One of the most important questions I faced in interviews was how promises are implemented. Since async/await is becoming more popular, you need to understand promises.我在采訪中面臨的最重要的問題之一是如何實現承諾。 由于異步/等待變得越來越流…

linux 文件理解,對linux中文件系統的理解

首先在linux系統當中一個可被掛在的數據為一個文件系統1.在安裝linux過程中我們要進行磁盤分區&#xff0c;可以分根目錄/,‘/home‘&#xff0c;‘/boot’,swap等等這些分區&#xff0c;每一個分區(’/(根目錄)‘&#xff0c;’/home‘...)就是一個文件系統。2.文件系統分配完…

編譯原理—語法分析器(Java)

遞歸下降語法分析 1. 語法成分說明 <語句塊> :: begin<語句串> end <語句串> :: <語句>{&#xff1b;<語句>} <語句> :: <賦值語句> | <循環語句> | <條件語句> <關系運算符> :: < | < | > | > | |…

老筆記整理四:字符串的完美度

今天在寵果網上發現一道題目&#xff0c;求一個字符串的完美度http://hero.pongo.cn/home/index覺得這道題很有趣就挑戰了一下&#xff0c;結果沒有在規定的1小時里面寫完&#xff08;笑&#xff09;&#xff0c;多花了10分鐘終于做出來了。題目是這樣的&#xff1a;我們要給每…

nlp構建_使用NLP構建自殺性推文分類器

nlp構建Over the years, suicide has been one of the major causes of death worldwide, According to Wikipedia, Suicide resulted in 828,000 global deaths in 2015, an increase from 712,000 deaths in 1990. This makes suicide the 10th leading cause of death world…

域名跳轉

案例&#xff1a;當訪問lsx.com網站&#xff0c;是我最早論壇的域名。回車之后會自動跳轉到lshx.com。 為什么藥lsx跳轉到lshx.com呢&#xff1f; 為了統一品牌。建議換成了lshx.com。所有之前的lsx.com就不要用了&#xff0c;就讓它跳轉到lshx.com。是因為之前lsx.com上有很多…

Elastic Stack 安裝

Elastic Stack 是一套支持數據采集、存儲、分析、并可視化全面的分析工具&#xff0c;簡稱 ELK&#xff08;Elasticsearch&#xff0c;Logstash&#xff0c;Kibana&#xff09;的縮寫。 安裝Elastic Stack 時&#xff0c;必須相關組件使用相同的版本&#xff0c;例如&#xff1…

區塊鏈去中心化分布式_為什么漸進式去中心化是區塊鏈的最大希望

區塊鏈去中心化分布式by Arthur Camara通過亞瑟卡馬拉(Arthur Camara) 為什么漸進式去中心化是區塊鏈的最大希望 (Why Progressive Decentralization is blockchain’s best hope) 不變性是區塊鏈的最大優勢和最大障礙。 逐步分權可能是答案。 (Immutability is blockchain’s…