日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# new关键字和对象类型转换(双括号、is操作符、as操作符)

發布時間:2023/11/29 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的C# new关键字和对象类型转换(双括号、is操作符、as操作符)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。