關(guān)于C#結(jié)構(gòu)的一些認識
C#結(jié)構(gòu)了解之前的話:在C++語言里面結(jié)構(gòu)struct和類在許多方面都是相近的,只不過在存取方式上存在差別。但是,在C#下結(jié)構(gòu)和類有著明顯的不同點:
1、C#結(jié)構(gòu)是堆棧對象,不能在堆上創(chuàng)建它;
2、C#結(jié)構(gòu)可以繼承接口,但是不能繼承自其它結(jié)構(gòu);
3、不能重寫結(jié)構(gòu)的默認構(gòu)造函數(shù),需要自定義構(gòu)造函數(shù)時必須創(chuàng)建附帶參數(shù)的構(gòu)造函數(shù),以保證和默認構(gòu)造函數(shù)的參數(shù)列表有所區(qū)別;
4、當(dāng)使用new來創(chuàng)建結(jié)構(gòu)對象時其構(gòu)造函數(shù)自動被調(diào)用,若僅是像聲明一個int類型的變量那樣聲明一個結(jié)構(gòu)類型的變量而不new的話,那么結(jié)構(gòu)中成員變量必須被初始化后才能使用該結(jié)構(gòu)對象。
C#結(jié)構(gòu)實例:
- 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
 
上述代碼顯示默認的構(gòu)造函數(shù)被調(diào)用,構(gòu)造函數(shù)將所有結(jié)構(gòu)中的int成員變量都自動初始化為0,這就是為何合計為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ù)不會被調(diào)用,僅是聲明一個結(jié)構(gòu)類型的變量s2,但是緊接著我們?yōu)榻Y(jié)構(gòu)的所有成員變量進行初始化賦值,那么結(jié)構(gòu)照樣可以使用。盡管很多人都在爭論,認為這種賦值伎倆太不專業(yè)且顯得有點傻,然而誰也無法找到合情合理的解釋,但是這樣做的確可行。當(dāng)我們注釋掉賦值語句后,編譯器則會報錯:使用了未賦值的本地變量s2。
我們還可以使用自定義構(gòu)造函數(shù)并傳遞一個整型變量來創(chuàng)建結(jié)構(gòu)對象,代碼如下:
- 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)使用類僅存儲一些數(shù)據(jù)時,你會發(fā)現(xiàn)使用結(jié)構(gòu)會好得多!結(jié)構(gòu)化數(shù)組是在堆上創(chuàng)建的,而以一個一個類的形式來創(chuàng)建對象,則必須提前在堆上分配內(nèi)存,而且每個類的引用地址也需要額外保存起來,所以使用結(jié)構(gòu)化數(shù)組則更加的有效率。實際上在.Net框架里大部分類也都是結(jié)構(gòu),譬如:System.Drawing.Point。
關(guān)于C#結(jié)構(gòu)的相關(guān)內(nèi)容就向你介紹到這里,希望對你學(xué)習(xí)C#結(jié)構(gòu)有所幫助。
【編輯推薦】















 
 
 


 
 
 
 