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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途

發(fā)布時(shí)間:2023/12/10 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文將介紹以下內(nèi)容:

  • 類型的基本概念?
  • 值類型深入
  • 引用類型深入
  • 值類型與引用類型的比較及應(yīng)用

[下載]:[類型示例代碼]

?

1.?引言

值類型與引用類型的話題經(jīng)過了兩個(gè)回合([第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理]和[第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊])的討論和切磋,我們就基本的理解層面來說已經(jīng)差不多了,但是對(duì)這一部分的進(jìn)一步把握和更深刻的理解還要繼續(xù)和深化,因?yàn)槲易约壕驮趦善l(fā)布之際,我就得到裝配腦袋兄的不倦指導(dǎo),之后又查閱了很多的資料發(fā)現(xiàn)類型在.NET或者說語言基礎(chǔ)中何其重要的內(nèi)涵和深度,因此關(guān)于這個(gè)話題的討論還沒有停止,以后我將繼續(xù)分享自己的所得與所感。

不過作為一個(gè)階段,本文將值類型和引用類型的討論從應(yīng)用示例角度來進(jìn)一步做以延伸,可以看作是對(duì)前兩回的補(bǔ)充性探討。我們從類型定義、實(shí)例創(chuàng)建、參數(shù)傳遞、類型判等、垃圾回收等幾個(gè)方面來簡(jiǎn)要的對(duì)上兩回的內(nèi)容做以剖析,并以一定的IL語言和內(nèi)存機(jī)制來說明,期望進(jìn)一步加深我們的理解和分析。?

2. 以代碼剖析

下面,我們以一個(gè)經(jīng)典的值類型和引用類型對(duì)比的示例來剖析,其區(qū)別和實(shí)質(zhì)。在剖析的過程中,我們主要以執(zhí)行分析(主要是代碼注釋)、內(nèi)存分析(主要是圖例說明)和IL分析(主要是IL代碼簡(jiǎn)析)三個(gè)方面來逐知識(shí)點(diǎn)解析,最后再做以總結(jié)描述,這樣就可以有更深的理解。

2.1 類型定義

定義簡(jiǎn)單的值類型MyStruct和引用類型MyClass,在后面的示例中將逐漸完善,完整的代碼可以點(diǎn)擊下載[類型示例代碼]。我們的討論現(xiàn)在開始,

  • 代碼演示
????//?01?定義值類型
????public?struct?MyStruct
????{
????????
private?int?_myNo;

????????
public?int?MyNo
????????{
????????????
get?{?return?_myNo;?}
????????????
set?{?_myNo?=?value;?}
????????}

????????
public?MyStruct(int?myNo)
????????{
????????????_myNo?
=?myNo;
????????}

????????
public?void?ShowNo()
????????{
????????????Console.WriteLine(_myNo);
????????}

????}

?

????//?02?定義引用類型
????public?class?MyClass
????{
????????
private?int?_myNo;

????????
public?int?MyNo
????????{
????????????
get?{?return?_myNo;?}
????????????
set?{?_myNo?=?value;?}
????????}

????????
public?MyClass()
????????{
????????????_myNo?
=?0;
????????}

????????
public?MyClass(int?myNo)
????????{
????????????_myNo?
=?myNo;
????????}


????????
public?void?ShowNo()
????????{
????????????Console.WriteLine(_myNo);
????????}
????}
  • ?IL分析

?

分析IL代碼可知,靜態(tài)方法.ctor用來表示實(shí)現(xiàn)構(gòu)造方法的定義,其中該段IL代碼表示將0賦給字段_myNo。

2.2 創(chuàng)建實(shí)例、初始化及賦值

接下來,我們完成實(shí)例創(chuàng)建和初始化,和簡(jiǎn)單的賦值操作,然后在內(nèi)存和IL分析中發(fā)現(xiàn)其實(shí)質(zhì)。

  • 代碼演示
創(chuàng)建實(shí)例、初始化及賦值
  • 內(nèi)存實(shí)況

首先是值類型和引用類型的定義,這是一切面向?qū)ο蟮拈_始,

??

?然后是初始化過程,

?

?簡(jiǎn)單的賦值和拷貝,是最基本的內(nèi)存操作,不妨看看,

??

2.3 參數(shù)傳遞

  • 代碼演示

?

?

參數(shù)傳遞

?

不必多說,就是一個(gè)簡(jiǎn)要闡釋,對(duì)于參數(shù)的傳遞作者將計(jì)劃以更多的筆墨來在后面的系列中做以澄清和深入。

2.4 類型轉(zhuǎn)換

類型轉(zhuǎn)換的演示,包括很多個(gè)方面,在此我們只以自定義類型轉(zhuǎn)換為例來做以說明,更詳細(xì)的類型轉(zhuǎn)換可以參考[第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊]的[再論類型轉(zhuǎn)換部分]。

  • 代碼演示

首先是值類型的自定義類型轉(zhuǎn)換,

?

????public?struct?MyStruct
????{????????
????????
//?01.2?自定義類型轉(zhuǎn):整形->MyStruct型
????????static?public?explicit?operator?MyStruct(int?myNo)
????????{
????????????
return?new?MyStruct(myNo);
????????}

????}


然后是引用類型的自定義類型轉(zhuǎn)換,

?

????public?class?MyClass
????{
????????
//?02.2?自定義類型轉(zhuǎn)換:MyClass->string型
????????static?public?implicit?operator?string(MyClass?mc)
????????{
????????????
return?mc.ToString();
????????}

????????
public?override?string?ToString()
????????{
????????????
return?_myNo.ToString();
????????}
????}


最后,我們對(duì)自定義的類型做以測(cè)試,

????????public?static?void?Main(string[]?args)
????????{??????????
????????????
#region?03.?類型轉(zhuǎn)換
????????????MyStruct?MyNum;
????????????
int?i?=?100;
????????????MyNum?
=?(MyStruct)i;
????????????Console.WriteLine(
"整形顯式轉(zhuǎn)換為MyStruct型---");
????????????Console.WriteLine(i);

????????????MyClass?MyCls?
=?new?MyClass(200);
????????????
string?str?=?MyCls;
????????????Console.WriteLine(
"MyClass型隱式轉(zhuǎn)換為string型---");
????????????Console.WriteLine(str);
????????????
#endregion???????????????????
???????????????????}???????

2.5 類型判等

類型判等主要包括:ReferenceEquals()、Equals()虛方法和靜態(tài)方法、==操作符等方面,同時(shí)注意在值類型和引用類型判等時(shí)的不同之處,可以參考[第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊]的[4. 再論類型判等]的簡(jiǎn)述。

?

  • 代碼演示?

// 01 定義值類型
public struct MyStruct
{

// 01.1 值類型的類型判等
public override bool Equals(object obj)
{
return base.Equals(obj);
}

}??

public class MyClass
{

// 02.1 引用類型的類型判等
public override bool Equals(object obj)
{
return base.Equals(obj);
}

}?

public static void Main(string[] args)

{

#region 05 類型判等
Console.WriteLine("類型判等---");
// 05.1 ReferenceEquals判等
//值類型總是返回false,經(jīng)過兩次裝箱的myStruct不可能指向同一地址
Console.WriteLine(ReferenceEquals(myStruct, myStruct));
//同一引用類型對(duì)象,將指向同樣的內(nèi)存地址
Console.WriteLine(ReferenceEquals(myClass, myClass));
//RefenceEquals認(rèn)為null等于null,因此返回true
Console.WriteLine(ReferenceEquals(null, null));

// 05.2 Equals判等
//重載的值類型判等方法,成員大小不同
Console.WriteLine(myStruct.Equals(myStruct2)) ;

//重載的引用類型判等方法,指向引用相同
Console.WriteLine(myClass.Equals(myClass2));

#endregion

}??

2.6 垃圾回收??

首先,垃圾回收機(jī)制,絕對(duì)不是三言兩語就能交代清楚,分析明白的。因此,本示例只是從最簡(jiǎn)單的說明出發(fā),對(duì)垃圾回收機(jī)制做以簡(jiǎn)單的分析,目的是有始有終的交代實(shí)例由創(chuàng)建到消亡的全過程。

  • 代碼演示

public static void Main(string[] args)
{

#region 06 垃圾回收的簡(jiǎn)單闡釋
//實(shí)例定義及初始化
MyClass mc1 = new MyClass();
//聲明但不實(shí)體化
MyClass mc2;
//拷貝引用,mc2和mc1指向同一托管地址
mc2 = mc1;
//定義另一實(shí)例,并完成初始化
MyClass mc3 = new MyClass();
//引用拷貝,mc1、mc2指向了新的托管地址
//那么原來的地址成為GC回收的對(duì)象,在
mc1 = mc3;
mc2 = mc3;
#endregion

}??

  • 內(nèi)存實(shí)況

?

GC執(zhí)行時(shí),會(huì)遍歷所有的托管堆對(duì)象,按照一定的遞歸遍歷算法找出所有的可達(dá)對(duì)象和不可訪問對(duì)象,顯然本示例中的托管堆A對(duì)象沒有被任何引用訪問,屬于不可訪問對(duì)象,將被列入執(zhí)行垃圾收集的目標(biāo)。對(duì)象由newobj指令產(chǎn)生,到被GC回收是一個(gè)復(fù)雜的過程,我們期望在系列的后期對(duì)此做以深入淺出的理解。?

2.7?總結(jié)陳述

這些示例主要從從基礎(chǔ)的方向入手來剖析前前兩回中的探討,不求能夠全面而深邃,但求能夠一點(diǎn)而及面的展開,技術(shù)的魅力正在于千變?nèi)f化,技術(shù)追求者的力求卻是從變化中尋求不變,不然我們實(shí)質(zhì)太累了,我想這就是好方法,本系列希望的就是提供一個(gè)入口,打開一個(gè)方法。示例的詳細(xì)分析可以下載[類型示例代碼],簡(jiǎn)單的分析希望能帶來絲絲愜意。?

3.?結(jié)論

值類型和引用類型,要說的,要做的,還有很多。此篇只是一個(gè)階段,更多的深入和探討我相信還在繼續(xù),同時(shí)廣泛的關(guān)注技術(shù)力量的成長(zhǎng),是每個(gè)人應(yīng)該進(jìn)取的空間和道路。

品味類型,為應(yīng)用之路開辟技術(shù)基礎(chǔ)。

品味類型,繼續(xù)探討還會(huì)更多精彩。

?

參考文獻(xiàn)

(USA)Jeffrey Richter, Applied Microsoft .NET Framework Programming

(USA)Jacquie Barker, Grant Palmer,?Beginning C# Objects From Concepts to Code

廣而告之

[下載]:[類型示例代碼]

??

溫故知新

[開篇有益]

[第一回:恩怨情仇:is和as]

[第二回:對(duì)抽象編程:接口和抽象類]

[第三回:歷史糾葛:特性和屬性]

[第四回:后來居上:class和struct]

[第五回:深入淺出關(guān)鍵字---把new說透]

[第六回:深入淺出關(guān)鍵字---base和this]

[第七回:品味類型---從通用類型系統(tǒng)開始]

[第八回:品味類型---值類型與引用類型(上)-內(nèi)存有理]

[第九回:品味類型---值類型與引用類型(中)-規(guī)則無邊]

總結(jié)

以上是生活随笔為你收集整理的[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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