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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net框架读书笔记---基础类型

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net框架读书笔记---基础类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

接上一篇.net框架讀書筆記---值類型的裝箱與拆箱,

一、Object

CLR要求每個(gè)類型都最終集成自System.Object類型,這意味著以下兩種定義是相同的:

?

//隱式繼承自O(shè)bject
class Employee
{
//...
}

//顯示繼承Object
class Employee : System.Object
{
//...
}

  CLR要求所有的對象都要用new操作符來創(chuàng)建。下面的語句展示了怎樣創(chuàng)建一個(gè)Employee對象:

?

Employee e = new Employee("para");

下面是new操作符所執(zhí)行的工作:

  • 從托管堆(managed heap)中分配指定類型所需數(shù)量的字節(jié)來作為存儲其對象的內(nèi)存空間。
  • 初始化對象的附加成員。內(nèi)一個(gè)對象實(shí)例都有兩個(gè)附加成員。其中第一個(gè)成員指向類型方法表的指針,第二個(gè)成員為SyncBlockIndex(CLR使用該字段進(jìn)行線程同步控制),CLR使用這兩個(gè)成員來管理對象的實(shí)例。
  • 傳入new操作符中指定的參數(shù)(上面例子為“para”),調(diào)用類型的實(shí)例構(gòu)造器;

  在new完成所有這些操作后,它將返回一個(gè)指向新創(chuàng)建對象的引用。在上面例子中,該引用被保存在變量e中,其類型為Employee。沒有和new對應(yīng)的delete操作符,在CLR中,我們無法顯式釋放對象所占用的內(nèi)存,CLR引入一種垃圾收集環(huán)境來自動檢測那些不再被使用或訪問的對象,并自動釋放他們的內(nèi)存。

二、類型轉(zhuǎn)換

  CLR最重要的一個(gè)特性就是類型安全。CLR在運(yùn)行時(shí)總能知道一個(gè)對象的類型。也可以通過調(diào)用GetType方法來得到對象的準(zhǔn)確類型。CLR允許我們將對象轉(zhuǎn)換為其原來的類型或者它的任何一個(gè)基類型,C#不需要任何特殊的語法就可以將對象轉(zhuǎn)換為其任何一個(gè)基類型,因?yàn)檗D(zhuǎn)化為基類型被認(rèn)為是安全的隱式操作,然而將對象轉(zhuǎn)換為它的任何派生類時(shí),C#要求進(jìn)行顯式轉(zhuǎn)型,因?yàn)檫@樣的轉(zhuǎn)型有可能會失敗。下面代碼演示了我如何將對象轉(zhuǎn)換為它的基類型和派生類型:、

?

代碼 class Program
{
static void Main(string[] args)
{
//這里不需要轉(zhuǎn)型,因?yàn)閚ew返回的是一個(gè)Employee對象。
//而object是Employee的基類型
object o = new Employee();

//這里需要轉(zhuǎn)型,因?yàn)镋mployee繼承自object
Employee e = (Employee)o;

Employee e1
= o;//這樣子編譯是通不過去的
}
}

class Employee
{
//...
}

上面的例子顯示了要是代碼通過編譯我們需要做的一些事情,下面解釋運(yùn)行時(shí)發(fā)生的行為。在運(yùn)行時(shí),CLR會檢查轉(zhuǎn)型操作以確保總是將對象轉(zhuǎn)型它的實(shí)際類型或者它的任何基類型。下面的代碼能夠通過編譯,但是在運(yùn)行時(shí)會拋出InvalidCastException異常:

?

代碼 class Employee
{
//...
}

class Manager : Employee
{
//...
}
class Program
{
static void Main(string[] args)
{
//構(gòu)造一個(gè)Manager對象并將其傳遞給PromoteEmployee。
//一個(gè)Manager“IS -A”Employee,PromoteEmployee將正常運(yùn)行
Manager m = new Manager();
PromoteEmployee(m);


//構(gòu)造一個(gè)DateTime對象并將其傳遞給PromoteEmployee。
//由于DateTime并非繼承自Employee,PromoteEmployee將會報(bào)錯(cuò)
DateTime newYears = new DateTime(2001, 1, 1);
PromoteEmployee(newYears);
}

public static void PromoteEmployee(object o)
{
//這里,編譯器不知道對象o引用的實(shí)際類型。
//所以編譯器允許代碼通過編譯。然而,在實(shí)際運(yùn)行時(shí),
//CLR會獲知o引用的類型(每當(dāng)進(jìn)行類型轉(zhuǎn)換操作時(shí)),
//并且會檢查對象是否為Employee,或者任何繼承自Employee類型

Employee e
= (Employee)o;
}
}

在Main方法中,我們首先構(gòu)造了一個(gè)Manager對象,并將其傳遞給PromoteEmployee。這段代碼會成功編譯并執(zhí)行,因?yàn)镸anager繼承自O(shè)bject,而object正是PromoteEmployee期望的參數(shù)類型。一旦進(jìn)入PromoteEmployee內(nèi)部,CLR將確認(rèn)o引用的對象或者是一個(gè)Employee,或者繼承自Employee的一個(gè)類型。因?yàn)镸anager繼承自Employee,所以CLR將成功執(zhí)行轉(zhuǎn)型操作,并允許PeomoteEmployee繼續(xù)執(zhí)行。

  在PromoteEmployee返回之后,Main又構(gòu)造了一個(gè)DateTime對象并將其傳遞給PromoteEmployee。同樣DateTime也繼承自O(shè)bject,所以PromoteEmployee將會編譯通過。但是在PromoteEmployee內(nèi)部,CLR會檢查轉(zhuǎn)型操作,并將檢測出o引用對象為DateTime類型,而不是Employee或者任何繼承自Employee的類型。這時(shí),CLR將禁止執(zhí)行轉(zhuǎn)型操作,并拋出InvalidCastException異常。

  如果CLR允許這樣的轉(zhuǎn)型操作,代碼也就失去了類型安全,結(jié)果將變得不可預(yù)期,類型安全是.net框架中非常重要的一個(gè)部分。

三、使用is和as操作符轉(zhuǎn)型

  C#提供了一種利用is操作符進(jìn)行轉(zhuǎn)型的方式。它檢查對象是否和給定的類型兼容,并返回判斷結(jié)果:true或者false。另外,is操作符永遠(yuǎn)不會拋出異常。下面為is操作符的典型使用方法:

?

if (o is Employee)
{
Employee e
= (Employee)o;
}

在上面的代碼中,CLR實(shí)際上會對對象的類型檢查了兩次:is操作符首先檢查o所引用的對象是否和Employee類型兼容。如果兼容,在if語句內(nèi),CLR在執(zhí)行轉(zhuǎn)型時(shí)又會檢查o事都為一個(gè)Employee引用。由于這種編程范式十分常見,C#便為我們提供一種新的轉(zhuǎn)型方式,即as操作符,它可以簡化代碼的同時(shí)提高性能,看下面代碼:

?

Employee e = o as Employee;
if (e != null)
{
///.......
}

在上面的代碼中,CLR會檢查o所引用的對象是否和Employee兼容。如果兼容,as返回一個(gè)指向同一個(gè)對象的非空指針。如果不兼容,as返回null。注意as操作符執(zhí)行過程中,CLR只檢查了一次對象的類型。效率高

總結(jié)

以上是生活随笔為你收集整理的.net框架读书笔记---基础类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。