.NET學習資料
.NET學習資料
.NET學習資料
一、結構體的定義與基本使用
(一)定義結構體
在 C# 中,使用struct關鍵字來創建結構體。它就像是一個模板,能定義出符合特定需求的數據結構。比如,若要跟蹤圖書館中書的信息,可定義如下Books結構體:
struct Books
{public string title;public string author;public string subject;public int book_id;
}
在這個結構體定義中,包含了表示書籍標題(title)、作者(author)、主題(subject)以及書籍編號(book_id)的成員變量,類型分別為string和int ,通過這些成員變量可以全面描述一本書的關鍵屬性。
(二)結構體的使用示例
下面是一個完整展示結構體用法的程序示例:
using System;struct Books
{public string title;public string author;public string subject;public int book_id;
};public class testStructure
{public static void Main(string[] args){// 聲明兩個Books類型的結構體變量Book1和Book2Books Book1; Books Book2; // 為Book1的各個成員變量賦值Book1.title = "C Programming";Book1.author = "Nuha Ali";Book1.subject = "C Programming Tutorial";Book1.book_id = 6495407;// 為Book2賦值Book2.title = "Telecom Billing";Book2.author = "Zara Ali";Book2.subject = "Telecom Billing Tutorial";Book2.book_id = 6495700;// 打印Book1的詳細信息Console.WriteLine("Book 1 title : {0}", Book1.title);Console.WriteLine("Book 1 author : {0}", Book1.author);Console.WriteLine("Book 1 subject : {0}", Book1.subject);Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);// 打印Book2的詳細信息Console.WriteLine("Book 2 title : {0}", Book2.title);Console.WriteLine("Book 2 author : {0}", Book2.author);Console.WriteLine("Book 2 subject : {0}", Book2.subject);Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);Console.ReadKey();}
}
上述代碼編譯并執行后,輸出結果如下:
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
從示例中能清晰看到,通過結構體變量可方便地訪問和操作其內部各個成員變量,分別對不同書籍信息進行賦值和展示,體現了結構體在組織和管理相關數據方面的便利性。
二、C# 結構的特點
(一)豐富的成員類型
結構體不僅能存儲簡單數據,還可帶有方法、字段、索引、屬性、運算符方法和事件等多種成員類型。這使其能適用于表示各種輕量級數據,如坐標(包含 x 和 y 坐標值的結構體,搭配方法進行坐標運算等操作)、范圍(定義包含起始值和結束值的結構體,以及判斷是否包含某個值的方法等)、日期、時間等。
(二)構造函數相關限制與特性
結構體可以定義構造函數,但不能定義析構函數 。并且,結構體不能定義無參構造函數,無參構造函數(默認)由系統自動定義,且不能手動改變。例如:
struct Point
{public int X;public int Y;// 合法的有參構造函數public Point(int x, int y){X = x;Y = y;}// 以下是非法的無參構造函數定義,結構體不允許這樣寫// public Point()// {// }
}
(三)繼承方面的限制
結構體不能繼承其他的結構或類,也不能作為其他結構或類的基礎結構。這意味著結構體在繼承體系方面相對獨立,更側重于簡單地封裝和處理自身內部定義的數據和相關邏輯,不像類那樣能通過繼承擴展功能、實現多態等復雜的面向對象設計模式。
(四)接口實現能力
雖然結構體不能參與繼承關系,但它具備實現一個或多個接口的能力。通過實現接口,結構體可以遵循接口中定義的契約,從而獲得特定的行為和功能。例如,若定義一個包含計算面積方法的接口,結構體可以實現該接口來提供面積計算的具體實現。
(五)成員修飾符限制
結構體中的成員默認是public的,也可以使用其他訪問修飾符,如private、protected等,但相比類,其使用場景和限制有所不同。例如,在結構體中使用private修飾成員時,需要通過屬性或方法來訪問這些私有成員,以確保數據的安全性和封裝性。
(六)實例化與初始化特點
在實例化結構體時,可以使用構造函數進行初始化,也可以在聲明后分別對成員進行賦值。例如:
Point p1 = new Point(10, 20);
Point p2;
p2.X = 30;
p2.Y = 40;
(七)內存分配與性能特點
結構體是值類型,通常在棧上分配內存(在某些情況下,如作為類的成員時,可能會隨類一起在堆上分配)。這使得結構體在傳遞和使用時,是按值復制的,在處理小數據結構且頻繁復制或傳遞時,性能表現較好,能減少內存分配和垃圾回收的開銷。但如果結構體過大,值傳遞時會產生較大性能開銷。
(八)可變性特點
結構體默認是可變的,即其成員的值可以在創建后被修改。不過,也可以通過將結構體設計為不可變(所有成員為只讀或通過特定設計保證不可修改)來提高其在多線程環境中的安全性,避免數據競爭問題。
三、類 vs 結構
(一)值類型 vs 引用類型
結構體是值類型,在棧上分配內存(特殊情況除外),賦值或傳遞時是按值復制;類是引用類型,對象在堆上分配內存,賦值或傳遞時傳遞的是對象的引用。
(二)繼承和多態性
結構體不支持繼承,不能從其他結構體或類繼承,也不能被其他結構體或類繼承;類支持繼承和多態,可以通過繼承實現代碼復用和多態行為。
(三)默認構造函數
結構體隱式地具有一個無參數的默認構造函數,將所有字段初始化為默認值,但不能手動定義無參構造函數;類可以顯式地定義默認構造函數或其他構造函數。
(四)賦值行為
結構體賦值時,會創建一個新的副本,兩個變量相互獨立;類賦值時,只是復制引用,兩個變量指向同一個對象,對其中一個變量的修改會影響另一個。
(五)傳遞方式
結構體作為方法參數傳遞時,是按值傳遞,方法內對參數的修改不會影響外部變量;類作為方法參數傳遞時,是按引用傳遞,方法內對參數的修改會影響外部變量。
(六)可空性
結構體本身不可空,但可以通過Nullable類型使其可空;類本身就是引用類型,默認可以為null。
(七)性能和內存分配
在處理小數據結構且頻繁復制或傳遞時,結構體性能更好,內存使用更高效;對于大數據結構或需要復雜的對象層次和多態行為時,類更合適。因為結構體過大時,值傳遞開銷大,且不支持繼承和多態,無法滿足復雜需求。