溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#結(jié)構(gòu)和類的不同點(diǎn)有哪些

發(fā)布時(shí)間:2021-09-15 06:52:36 來源:億速云 閱讀:128 作者:chen 欄目:編程語言

這篇文章主要講解了“C#結(jié)構(gòu)和類的不同點(diǎn)有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#結(jié)構(gòu)和類的不同點(diǎn)有哪些”吧!

1、C#結(jié)構(gòu)是堆棧對(duì)象,不能在堆上創(chuàng)建它;

2、C#結(jié)構(gòu)可以繼承接口,但是不能繼承自其它結(jié)構(gòu);

3、不能重寫結(jié)構(gòu)的默認(rèn)構(gòu)造函數(shù),需要自定義構(gòu)造函數(shù)時(shí)必須創(chuàng)建附帶參數(shù)的構(gòu)造函數(shù),以保證和默認(rèn)構(gòu)造函數(shù)的參數(shù)列表有所區(qū)別;

4、當(dāng)使用new來創(chuàng)建結(jié)構(gòu)對(duì)象時(shí)其構(gòu)造函數(shù)自動(dòng)被調(diào)用,若僅是像聲明一個(gè)int類型的變量那樣聲明一個(gè)結(jié)構(gòu)類型的變量而不new的話,那么結(jié)構(gòu)中成員變量必須被初始化后才能使用該結(jié)構(gòu)對(duì)象。

C#結(jié)構(gòu)實(shí)例:

struct Student : IGrade   public int maths;  public int english;  public int csharp;   public int GetTot()      {  return maths+english+csharp;      }       public Student(int y)  {  maths = english = csharp = y;   }  }      public string GetGrade()   {  if(GetTot() > 240 )   return "Brilliant";  if(GetTot() > 140 )  return "Passed";  return "Failed";   }  }  interface IGrade  {      string GetGrade();  }

接下來看看怎么使用剛才創(chuàng)建的C#結(jié)構(gòu),代碼如下:

Student s1 = new Student();  Console.WriteLine(s1.GetTot());  Console.WriteLine(s1.GetGrade());

C#結(jié)構(gòu)示例之輸出:

0  Failed

上述代碼顯示默認(rèn)的構(gòu)造函數(shù)被調(diào)用,構(gòu)造函數(shù)將所有結(jié)構(gòu)中的int成員變量都自動(dòng)初始化為0,這就是為何合計(jì)為0的原因。

下面來看一段有意思的代碼:

Student s2;  s2.maths = s2.english = s2.csharp = 50;  Console.WriteLine(s2.GetTot());  Console.WriteLine(s2.GetGrade());

C#結(jié)構(gòu)示例之輸出:

150  Passed

上述代碼我們沒有使用new來創(chuàng)建結(jié)構(gòu),所以構(gòu)造函數(shù)不會(huì)被調(diào)用,僅是聲明一個(gè)結(jié)構(gòu)類型的變量s2,但是緊接著我們?yōu)榻Y(jié)構(gòu)的所有成員變量進(jìn)行初始化賦值,那么結(jié)構(gòu)照樣可以使用。盡管很多人都在爭論,認(rèn)為這種賦值伎倆太不專業(yè)且顯得有點(diǎn)傻,然而誰也無法找到合情合理的解釋,但是這樣做的確可行。當(dāng)我們注釋掉賦值語句后,編譯器則會(huì)報(bào)錯(cuò):使用了未賦值的本地變量s2。

我們還可以使用自定義構(gòu)造函數(shù)并傳遞一個(gè)整型變量來創(chuàng)建結(jié)構(gòu)對(duì)象,代碼如下:

Student s3 = new Student(90);  Console.WriteLine(s3.GetTot());  Console.WriteLine(s3.GetGrade());

C#結(jié)構(gòu)示例之輸出:

270  Brilliant

不像類是引用類型,結(jié)構(gòu)是值類型的,所以結(jié)構(gòu)比類操作起來更簡單。當(dāng)使用類僅存儲(chǔ)一些數(shù)據(jù)時(shí),你會(huì)發(fā)現(xiàn)使用結(jié)構(gòu)會(huì)好得多!結(jié)構(gòu)化數(shù)組是在堆上創(chuàng)建的,而以一個(gè)一個(gè)類的形式來創(chuàng)建對(duì)象,則必須提前在堆上分配內(nèi)存,而且每個(gè)類的引用地址也需要額外保存起來,所以使用結(jié)構(gòu)化數(shù)組則更加的有效率。實(shí)際上在.Net框架里大部分類也都是結(jié)構(gòu),譬如:System.Drawing.Point。

感謝各位的閱讀,以上就是“C#結(jié)構(gòu)和類的不同點(diǎn)有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C#結(jié)構(gòu)和類的不同點(diǎn)有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI