認知結構(C# Struct)
在C++語言裡面結構struct和類在許多方面都是相近的,甚至相同,只不過在存取方式上存在差別。但是,在C#下結構和類有著明顯的不同點:
1、結構是堆疊物件,不能在堆上建立它;
2、結構可以繼承介面,但是不能繼承自其它結構;
3、不能重寫結構的預設建構函式,需要自定義建構函式時必須建立附帶引數的建構函式,以保證和預設建構函式的引數列表有所區別;
4、當使用new來建立結構物件時其建構函式自動被呼叫,若僅是像宣告一個int型別的變數那樣宣告一個結構型別的變數而不new的話,那麼結構中成員變數必須被初始化後才能使用該結構物件。
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();
}
接下來看看怎麼使用剛才建立的結構,程式碼如下:
Student s1 = new Student();
Console.WriteLine(s1.GetTot());
Console.WriteLine(s1.GetGrade());
輸出:
0
Failed
上述程式碼顯示預設的建構函式被呼叫,建構函式將所有結構中的int成員變數都自動初始化為0,這就是為何合計為0的原因。
下面來看一段有意思的程式碼:
Student s2;
s2.maths = s2.english = s2.csharp = 50;
Console.WriteLine(s2.GetTot());
Console.WriteLine(s2.GetGrade());
輸出:
150
Passed
上述程式碼我們沒有使用new來建立結構,所以建構函式不會被呼叫,僅是宣告一個結構型別的變數s2,但是緊接著我們為結構的所有成員變數進行初始化賦值,那麼結構照樣可以使用。儘管很多人都在爭論,認為這種賦值伎倆太不專業且顯得有點傻,然而誰也無法找到合情合理的解釋,但是這樣做的確可行。當我們註釋掉賦值語句後,編譯器則會報錯:使用了未賦值的本地變數s2。
我們還可以使用自定義建構函式並傳遞一個整型變數來建立結構物件,程式碼如下:
Student s3 = new Student(90);
Console.WriteLine(s3.GetTot());
Console.WriteLine(s3.GetGrade());
輸出:
270
Brilliant
不像類是引用型別,結構是值型別的,所以結構比類操作起來更簡單。當使用類僅儲存一些資料時,你會發現使用結構會好得多!結構化陣列是在堆上建立的,而以一個一個類的形式來建立物件,則必須提前在堆上分配記憶體,而且每個類的引用地址也需要額外儲存起來,所以使用結構化陣列則更加的有效率。實際上在.Net框架裡大部分類也都是結構,譬如:System.Drawing.Point。
1、結構是堆疊物件,不能在堆上建立它;
2、結構可以繼承介面,但是不能繼承自其它結構;
3、不能重寫結構的預設建構函式,需要自定義建構函式時必須建立附帶引數的建構函式,以保證和預設建構函式的引數列表有所區別;
4、當使用new來建立結構物件時其建構函式自動被呼叫,若僅是像宣告一個int型別的變數那樣宣告一個結構型別的變數而不new的話,那麼結構中成員變數必須被初始化後才能使用該結構物件。
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();
}
接下來看看怎麼使用剛才建立的結構,程式碼如下:
Student s1 = new Student();
Console.WriteLine(s1.GetTot());
Console.WriteLine(s1.GetGrade());
輸出:
0
Failed
上述程式碼顯示預設的建構函式被呼叫,建構函式將所有結構中的int成員變數都自動初始化為0,這就是為何合計為0的原因。
下面來看一段有意思的程式碼:
Student s2;
s2.maths = s2.english = s2.csharp = 50;
Console.WriteLine(s2.GetTot());
Console.WriteLine(s2.GetGrade());
輸出:
150
Passed
上述程式碼我們沒有使用new來建立結構,所以建構函式不會被呼叫,僅是宣告一個結構型別的變數s2,但是緊接著我們為結構的所有成員變數進行初始化賦值,那麼結構照樣可以使用。儘管很多人都在爭論,認為這種賦值伎倆太不專業且顯得有點傻,然而誰也無法找到合情合理的解釋,但是這樣做的確可行。當我們註釋掉賦值語句後,編譯器則會報錯:使用了未賦值的本地變數s2。
我們還可以使用自定義建構函式並傳遞一個整型變數來建立結構物件,程式碼如下:
Student s3 = new Student(90);
Console.WriteLine(s3.GetTot());
Console.WriteLine(s3.GetGrade());
輸出:
270
Brilliant
不像類是引用型別,結構是值型別的,所以結構比類操作起來更簡單。當使用類僅儲存一些資料時,你會發現使用結構會好得多!結構化陣列是在堆上建立的,而以一個一個類的形式來建立物件,則必須提前在堆上分配記憶體,而且每個類的引用地址也需要額外儲存起來,所以使用結構化陣列則更加的有效率。實際上在.Net框架裡大部分類也都是結構,譬如:System.Drawing.Point。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14325734/viewspace-545395/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 瞭解下C# 結構體(Struct)C#結構體Struct
- c#之結構struct(2)_小記C#Struct
- 結構 STRUCTStruct
- 結構體struct結構體Struct
- C# 中的只讀結構體(readonly struct)C#結構體Struct
- c#之structC#Struct
- 結構體定義:struct與typedef struct 用法詳解和用法小結結構體Struct
- 我對C#的認知。C#
- 我對C#的認知C#
- 認知列舉(C# Enum)C#
- Golang 學習——結構體 struct (一)Golang結構體Struct
- Golang 學習——結構體 struct (二)Golang結構體Struct
- go 結構體 (struct) 和方法 (method)Go結構體Struct
- fstat函式及struct stat結構函式Struct
- C# 中 Struct 和 Class 的區別總結C#Struct
- 重學c#————structC#Struct
- struct 結構體 -Go 學習記錄Struct結構體Go
- golang 學習之路之 struct 結構體GolangStruct結構體
- mysql表結構自動生成golang structMySqlGolangStruct
- 上下文 Context 與結構體 StructContext結構體Struct
- Golang中struct結構標籤(Tag)的使用GolangStruct
- 程式控制塊PCB結構 task_struct 描述Struct
- C#結構C#
- C#:結構C#
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- pat—結構體排序(用map彌補struct缺陷)結構體排序Struct
- 結構體定義 typedef struct 用法詳解和用法小結結構體Struct
- C#結構體C#結構體
- c#之tcbs struct(2)小記C#Struct
- C語言中結構體struct的對齊問題C語言結構體Struct
- 【資料結構篇】認識資料結構資料結構
- c#之IntPtr結構C#
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- Solidity語言學習筆記————15、結構體StructSolid筆記結構體Struct
- C++ 結構體struct和共同體union的區別C++結構體Struct
- 瞭解下C# 程式結構C#
- struct 和 interface:結構體與介面都實現了哪些功能?Struct結構體