認知結構(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# 中的只讀結構體(readonly struct)C#結構體Struct
- struct結構體專案1Struct結構體
- C# 中 Struct 和 Class 的區別總結C#Struct
- 重學c#————structC#Struct
- Golang 學習——結構體 struct (一)Golang結構體Struct
- Golang 學習——結構體 struct (二)Golang結構體Struct
- go 結構體 (struct) 和方法 (method)Go結構體Struct
- 我對C#的認知。C#
- 我對C#的認知C#
- 上下文 Context 與結構體 StructContext結構體Struct
- mysql表結構自動生成golang structMySqlGolangStruct
- struct 結構體 -Go 學習記錄Struct結構體Go
- golang 學習之路之 struct 結構體GolangStruct結構體
- rust學習六、簡單的struct結構RustStruct
- Golang中struct結構標籤(Tag)的使用GolangStruct
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- C語言中結構體struct的對齊問題C語言結構體Struct
- Solidity語言學習筆記————15、結構體StructSolid筆記結構體Struct
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- 【資料結構篇】認識資料結構資料結構
- 瞭解下C# 程式結構C#
- 認知網路知識點及例題總結
- struct 和 interface:結構體與介面都實現了哪些功能?Struct結構體
- 【細品架構2/100】架構之概念認知架構
- C#使用struct直接轉換下位機資料C#Struct
- C#中的資料結構C#資料結構
- 資料結構知識點--儲存結構與邏輯結構資料結構
- C#資料結構-靜態連結串列C#資料結構
- 認知篇:CQRS架構模式的本質架構模式
- 對前端跨域方案的認知總結前端跨域
- C# 中 System.Range 結構體C#結構體
- Go語言結構體(struct)物件導向程式設計基礎篇Go結構體Struct物件程式設計
- 磁碟知識體系結構
- C#資料結構-二叉樹-順序儲存結構C#資料結構二叉樹
- 【來聊一聊前端架構之一】前端架構認知前端架構
- [swift 進階]讀書筆記-第五章:結構體和類 C5P3_結構體(struct)Swift筆記結構體Struct
- 結構struct(值型別)在實際應用中應該注意的點Struct型別