真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

目錄:

創(chuàng)新互聯(lián)建站是專(zhuān)業(yè)的梅里斯網(wǎng)站建設(shè)公司,梅里斯接單;提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行梅里斯網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

【C#小知識(shí)】C#中一些易混淆概念總結(jié)

繼上篇對(duì)一些C#概念問(wèn)題進(jìn)行細(xì)節(jié)的剖析以后,收獲頗多。以前,讀書(shū)的時(shí)候,一句話一掠而過(guò),但是現(xiàn)在再去重讀的時(shí)候,每句話發(fā)現(xiàn)都包含大量的信息。這一篇繼續(xù)總結(jié)自己的學(xué)習(xí)筆記,給大家深度的剖析一些概念性問(wèn)題,有助于大家對(duì)C#的理解。

--------------------------------------------------分割線---------------------------------------------

一,構(gòu)造函數(shù)

我們先創(chuàng)建一個(gè)類(lèi),如下面的代碼:

class Program
    {
        static void Main(string[] args)
        {
       
        }
    }
  //創(chuàng)建一個(gè)Person類(lèi)
    class Person
    {
    }

然后生成代碼。

我們使用.NET Reflector反編譯該程序集。會(huì)發(fā)現(xiàn)該類(lèi)一被編譯,CLR會(huì)自動(dòng)的為該類(lèi)創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù)。如下圖:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

所以在創(chuàng)建該對(duì)象的時(shí)候,會(huì)默認(rèn)的為該類(lèi)生成一個(gè)無(wú)參數(shù)的空方法體的構(gòu)造函數(shù)。如果我們不顯式的寫(xiě)明構(gòu)造函數(shù),CLR會(huì)為我們調(diào)用默認(rèn)的構(gòu)造函數(shù)。

class Person
    {
        //聲明有實(shí)現(xiàn)的構(gòu)造函數(shù)
        public Person()
        {
            Console.WriteLine("我是超人!");
        }
    }

再次反編譯該程序集,會(huì)發(fā)現(xiàn)添加的構(gòu)造函數(shù)覆蓋了C#編譯器默認(rèn)為該類(lèi)生成的構(gòu)造函數(shù),如下圖:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

所以,當(dāng)程序員手動(dòng)添加了任意類(lèi)型的構(gòu)造函數(shù),C#編譯器就不會(huì)為該類(lèi)添加默認(rèn)的構(gòu)造函數(shù)。

構(gòu)造函數(shù)的特點(diǎn):

①訪問(wèn)修飾符一般是Public②沒(méi)有返回值,方法名與類(lèi)名稱(chēng)一致;

二,This關(guān)鍵字的作用

①this關(guān)鍵字代表當(dāng)前對(duì)象,當(dāng)前運(yùn)行在內(nèi)存中的那一個(gè)對(duì)象。我們添加如下的代碼:

private int nAge;
        public int NAge
        {
            get { return nAge; }
            set { nAge = value; }
        }
        //聲明有實(shí)現(xiàn)的構(gòu)造函數(shù)
        public Person()
        {
            this.NAge = 100;
            Console.WriteLine("我是超人!");
        }

這時(shí)候我們反編譯該程序集,會(huì)看到如下結(jié)果:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

可以看到this關(guān)鍵字代替的就是當(dāng)前的Person對(duì)象。

②this關(guān)鍵字后面跟“:”符號(hào),可以調(diào)用其它的構(gòu)造函數(shù)

我們?cè)偬砑尤缦碌拇a:

#region 對(duì)象的構(gòu)造函數(shù)
        //聲明有實(shí)現(xiàn)的構(gòu)造函數(shù)
        public Person()
        {
            this.NAge = 100;
            Console.WriteLine("我是超人!");
        }
        public Person(int nAge)
        {
            Console.WriteLine("超人的年齡{0}", nAge);
        }
     //使用this關(guān)鍵字調(diào)用了第二個(gè)一個(gè)參數(shù)的構(gòu)造函數(shù)
        public Person(int nAge, string strName)
            : this(1)
        {
            Console.WriteLine("我是叫{0}的超人,年齡{1}", strName, nAge);
        }
        #endregion

我們創(chuàng)建該對(duì)象看看是否調(diào)用成功。在Main函數(shù)中添加如下代碼:

Person p = new Person(10,"強(qiáng)子");

我們運(yùn)行代碼,看到的打印結(jié)果如下:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

由結(jié)果我們可以分析出,當(dāng)含有兩個(gè)默認(rèn)參數(shù)的對(duì)象創(chuàng)建的時(shí)候應(yīng)該先調(diào)用了一個(gè)參數(shù)的構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行初始化,然后有調(diào)用了含有兩個(gè)參數(shù)的構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行初始化。

那么到底是不是這個(gè)樣子呢?看下邊的調(diào)試過(guò)程:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

通過(guò)上面的調(diào)試過(guò)程我們會(huì)發(fā)現(xiàn),當(dāng)構(gòu)造函數(shù)使用this關(guān)鍵字調(diào)用其它的構(gòu)造函數(shù)時(shí),首先調(diào)用的是該調(diào)用的構(gòu)造函數(shù),在調(diào)用被調(diào)用的構(gòu)造函數(shù),先執(zhí)行被調(diào)用的構(gòu)造函數(shù),在執(zhí)行直接調(diào)用的構(gòu)造函數(shù)。

為什么要這個(gè)順序執(zhí)行?因?yàn)槲覀兡J(rèn)的傳值是10,我們需要打印的超人的年齡是“10”,如果先執(zhí)行直接調(diào)用的構(gòu)造函數(shù),就會(huì)被被調(diào)用構(gòu)造函數(shù)覆蓋。

三,部分類(lèi)

在同一命名空間下可以使用partial關(guān)鍵字聲明相同名稱(chēng)的類(lèi)(同一命名空間下默認(rèn)不允許出現(xiàn)相同的類(lèi)名稱(chēng)),叫做部分類(lèi)或者伙伴類(lèi)。

如下圖,當(dāng)在同一命名空間下聲明相同名稱(chēng)的類(lèi),編譯器報(bào)錯(cuò):

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

當(dāng)我們使用Partial關(guān)鍵字時(shí),可以順利編譯通過(guò),如下圖:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

分別添加如下的代碼:

partial class  Person
    {
        private string strAddress;
        public string StrAddress
        {
            get { return strAddress; }
            set { strAddress = value; }
        }
        private string strNumber;
        public string StrNumber
        {
            get { return strNumber; }
            set { strNumber = value; }
        }
        public void Run()
        {
        }
    }
                                                                                        
    partial class  Person
    {
        #region 對(duì)象屬性
        private int nAge;
        public int NAge
        {
            get { return nAge; }
            set { nAge = value; }
        }
        private string strName;
        public string StrName
        {
            get { return strName; }
            set { strName = value; }
        }
                                                                                            
        #endregion
        #region 對(duì)象的構(gòu)造函數(shù)
        //聲明有實(shí)現(xiàn)的構(gòu)造函數(shù)
        public Person()
        {
            this.NAge = 100;
            Console.WriteLine("我是超人!");
        }
        public Person(int nAge)
        {
            Console.WriteLine("超人的年齡{0}", nAge);
        }
        public Person(int nAge, string strName)
            : this(1)
        {
            Console.WriteLine("我是叫{0}的超人,年齡{1}", strName, nAge);
        }
        #endregion
        public void Sing()
        {
        }
    }

我們?cè)俅畏淳幾g該程序集,會(huì)發(fā)現(xiàn)如下的結(jié)果:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

我們會(huì)發(fā)現(xiàn)使用Partial關(guān)鍵字的兩個(gè)同名類(lèi),被編譯成了同一個(gè)類(lèi)。

所以部分類(lèi)的特點(diǎn):

①必須在同一個(gè)命名空間下的使用Partial關(guān)鍵字的同名類(lèi)

②部分類(lèi)其實(shí)就是一個(gè)類(lèi),C#編譯器會(huì)把它們編譯成一個(gè)類(lèi)

③在一個(gè)伙伴類(lèi)中定義的變量可以在另一個(gè)伙伴類(lèi)中訪問(wèn)(因?yàn)樗麄兙褪且粋€(gè)類(lèi))。

四,Const關(guān)鍵字和Readonly關(guān)鍵字的區(qū)別

1)const關(guān)鍵字

在Main函數(shù)中添加如下的代碼:

conststring strName = "強(qiáng)子";          

Console.WriteLine("我的名字叫{0}",strName);

編譯過(guò)后,我反編譯該程序集發(fā)現(xiàn)如下結(jié)果:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

發(fā)現(xiàn)定義的常量并沒(méi)有出現(xiàn)在反編譯的代碼中,而且使用Const常量的地方被常量代替了。

2)readonly關(guān)鍵字

添加如下代碼:

class cat
    {
        readonly string reOnlyName = "強(qiáng)子";
        public cat()
        {
            Console.WriteLine(reOnlyName);
        }
    }

生成后反編譯該程序集發(fā)現(xiàn),如下結(jié)果:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

我們發(fā)現(xiàn)被readonly修飾的變量并沒(méi)有被賦值,這是什么回事呢?我們點(diǎn)擊cat類(lèi)的構(gòu)造函數(shù)時(shí),看到如下結(jié)果:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

我們發(fā)現(xiàn)被readonly修飾的變量是在被調(diào)用的時(shí)候賦值的。

那么被readonly修飾的變量的是就是不可變的么?當(dāng)然不是,由反編譯的結(jié)果我們知道,readonly修飾的變量是在被調(diào)用的時(shí)候在構(gòu)造函數(shù)中被賦值的,那么我們可以在構(gòu)造函數(shù)中修改readonly的默認(rèn)值

添加如下代碼

class cat
    {
        readonly string reOnlyName = "強(qiáng)子";
        public cat()
        {
            this.reOnlyName = "子強(qiáng)";
            Console.WriteLine(reOnlyName);
        }
    }

在Main()函數(shù)中添加如下的代碼:

  cat ct = new cat();

運(yùn)行結(jié)果如下:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

說(shuō)明我們成功在構(gòu)造函數(shù)中修改了readonly變量的值。

readonly和const的區(qū)別:

const常量在聲明的時(shí)候就必須賦初始值,這樣聲明變量可以提高程序的運(yùn)行效率。而readonly變量聲明時(shí)可以不賦初始值,但一定要早構(gòu)造函數(shù)中賦初始值。

也就是說(shuō),const變量在編譯的時(shí)候就要確定常量的值,而readonly是在運(yùn)行的時(shí)候確定該變量的值的。

五,解析枚舉

枚舉的級(jí)別和類(lèi)的級(jí)別一樣,可以自定義數(shù)據(jù)類(lèi)型,可以在枚舉名稱(chēng)后使用“:”來(lái)指明枚舉類(lèi)型??慈缦麓a:

//定義一個(gè)方向的枚舉類(lèi)型,枚舉成員使用","分割
    enum Direction:string
    {
        east,
        west,
        south,
        north
    }

編譯會(huì)報(bào)錯(cuò),錯(cuò)誤信息如下:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

由此我們可以知道枚舉的數(shù)據(jù)類(lèi)型是值類(lèi)型。

因?yàn)槊杜e是數(shù)據(jù)類(lèi)型,所以可以直接聲明訪問(wèn),如下代碼:

class Program
    {
        static void Main(string[] args)
        {
            //枚舉是數(shù)據(jù)類(lèi)型可以直接聲明
            Direction dr = Direction.east;
            Console.WriteLine(dr);
            Console.ReadKey();
        }
    }
    //定義一個(gè)方向的枚舉類(lèi)型,枚舉成員使用","分割
    enum Direction
    {
        east,
        west,
        south,
        north
    }

也可以這樣訪問(wèn)枚舉類(lèi)型

class Program
    {
        static void Main(string[] args)
        {
            //枚舉是數(shù)據(jù)類(lèi)型可以直接聲明
           // Direction dr = Direction.east;
            Person p=new Person();
            //直接調(diào)用枚舉變量
            p.dir = Direction.east;
            Console.WriteLine(p.dir);
            Console.ReadKey();
        }
    }
     class Person
    {
        private string strName;
         //直接聲明枚舉變量
        public Direction dir;
    }

每一個(gè)枚舉成員都對(duì)應(yīng)了一個(gè)整型的數(shù)值,這個(gè)數(shù)值默認(rèn)從0開(kāi)始遞增,可以通過(guò)強(qiáng)制轉(zhuǎn)換獲取該枚舉所代表的值。可以通過(guò)如下的代碼訪問(wèn):

Direction dr = Direction.east;          

int i = (int)dr;

我們還可以手動(dòng)為每一個(gè)枚舉成員賦值,代表的是整型數(shù)值,賦值后該枚舉成員所代表的值就是所賦的值。如下代碼:

enum Direction
    {
        east=1,
        west=0,
        south=2,
        north=3
    }

將字符串轉(zhuǎn)換成枚舉

string strDir = "east";
           //將字符串轉(zhuǎn)換成枚舉類(lèi)型
           Direction d1=(Direction)Enum.Parse(typeof(Direction),strDir);
           //轉(zhuǎn)換的時(shí)候忽略大小寫(xiě)
           Direction d2 = (Direction)Enum.Parse(typeof(Direction), strDir,true);

--------------------------------分割線----------------------------------------

最后我們?cè)賮?lái)探究一個(gè)空指針異常的問(wèn)題

首先我們先聲明一個(gè)Dog類(lèi):

class Dog
    {
        private int nAge;
        public int NAge
        {
            get { return nAge; }
            set { nAge = value; }
        }
        private string strName;
        public string StrName
        {
            get { return strName; }
            set { strName = value; }
        }
    }

在Main()函數(shù)中我們這樣調(diào)用

Dog d = null;            

d.StrName= "旺旺";

結(jié)果會(huì)報(bào)錯(cuò),如下圖

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

我們已經(jīng)為屬性,封裝字段了,但是為什么沒(méi)有辦法給字段賦值呢?我們就來(lái)探究一下這個(gè)問(wèn)題。

當(dāng)我們實(shí)例化Dog對(duì)象,即

Dog d = new Dog();

.NET Framwork做了什么工作呢?如下圖:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

那為什么會(huì)報(bào)錯(cuò)呢,原因如下圖:

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

-----------------------------------------------分割線-----------------------------------------------------------------

這次分享到這里就結(jié)束了。其實(shí)蠻享受寫(xiě)這個(gè)過(guò)程的。因?yàn)樵诔醮蔚膶W(xué)的時(shí)候理解了,如果再寫(xiě)成博客就又加深了印象,最后希望大家都能養(yǎng)成了良好的學(xué)習(xí)習(xí)慣。


如果您覺(jué)得不錯(cuò),點(diǎn)擊右下角贊一下吧!您的支持,是我寫(xiě)作的動(dòng)力!

畢業(yè)實(shí)習(xí)交流群:221376964。你也可以關(guān)注我的新浪微博進(jìn)行交流。

C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉

當(dāng)前標(biāo)題:C#中一些易混淆概念總結(jié)(二)--------構(gòu)造函數(shù),this關(guān)鍵字,部分類(lèi),枚舉
URL分享:http://weahome.cn/article/pojjij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部