C# 結構體介紹


.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。

(七)性能和內存分配

在處理小數據結構且頻繁復制或傳遞時,結構體性能更好,內存使用更高效;對于大數據結構或需要復雜的對象層次和多態行為時,類更合適。因為結構體過大時,值傳遞開銷大,且不支持繼承和多態,無法滿足復雜需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67887.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67887.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67887.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖像噪聲處理技術:讓圖像更清晰的藝術

在這個數字化時代,圖像作為信息傳遞的重要載體,其質量直接影響著我們的視覺體驗和信息解讀。然而,在圖像采集、傳輸或處理過程中,難免會遇到各種噪聲干擾,如高斯噪聲、椒鹽噪聲等,這些噪聲會降低圖像的清晰…

追逐低空經濟,無人機研學技術詳解

追逐低空經濟,無人機研學技術成為了一個備受關注的領域。以下是對無人機研學技術的詳細解析: 一、無人機研學技術概述 無人機研學技術是以無人機為核心,結合航空科技、電子技術、機械原理等多領域知識的一種教育實踐活動。它旨在通過理論學習…

(done) MIT6.S081 2023 學習筆記 (Day7: LAB6 Multithreading)

網頁:https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任務1教會了你如何用 C 語言調用匯編,編譯后鏈接即可) 任務1:Uthread: switching between threads (完成) 在這個練習中,你將設計一個用戶級線程系統中的上下文切…

Kubernetes學習之通過Service訪問Pod

一、基礎概述 1.當通過deployment等controller動態創建和銷毀pod使得每個pod都有自己的ip地址,當controller用新的pod替代發生故障的pod時,新的pod會分配到新的ip地址,那么客戶端如何穩定的找到并訪問pod提供的服務。 2.創建service service從…

【優先算法】專題——前綴和

目錄 一、【模版】前綴和 參考代碼: 二、【模版】 二維前綴和 參考代碼: 三、尋找數組的中心下標 參考代碼: 四、除自身以外數組的乘積 參考代碼: 五、和為K的子數組 參考代碼: 六、和可被K整除的子數組 參…

CDDIS從2025年2月開始數據遷移

CDDIS 將從 2025 年 2 月開始將我們的網站從 cddis.nasa.gov 遷移到 earthdata.nasa.gov,并于 2025 年 6 月結束。 期間可能對GAMIT聯網數據下載造成影響。

谷歌Titans模型論文解析,Transformer迎來變革拐點——DeepSeek能否“接招”?

一、引入 Titans 模型 我們將深入探討谷歌研究院的一篇新論文《Titans: Learning to Memorize at Test Time》,該論文介紹了一種名為 Titans 的新模型架構。 Titans 在緩解 Transformer 二次方成本問題的同時,展現出了令人期待的成果。Titans 模型的設…

新春賀歲,共赴AGI之旅

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入! 往期精彩文章推薦 季姮教授獨家文字版干貨 | 面向知識淵博的大語言模型 關于AI TIME AI TIME源起于2019年,旨在發揚科學思辨精神,邀請各界人士對人工智能理論、算法和場景應用的本質問題…

Baklib推動數字化內容管理解決方案助力企業數字化轉型

內容概要 在當今信息爆炸的時代,數字化內容管理成為企業提升效率和競爭力的關鍵。企業在面對大量數據時,如何高效地存儲、分類與檢索信息,直接關系到其經營的成敗。數字化內容管理不僅限于簡單的文檔存儲,更是整合了文檔、圖像、…

【memgpt】letta 課程4:基于latta框架構建MemGpt代理并與之交互

Lab 3: Building Agents with memory 基于latta框架構建MemGpt代理并與之交互理解代理狀態,例如作為系統提示符、工具和agent的內存查看和編輯代理存檔內存MemGPT 代理是有狀態的 agents的設計思路 每個步驟都要定義代理行為 Letta agents persist information over time and…

測試方案和測試計劃相同點和不同點

在軟件測試領域,測試方案與測試計劃皆為舉足輕重的關鍵文檔,盡管它們有著緊密的關聯,但在目的與內容層面存在著顯著的差異。相同點: 1.共同目標:測試方案和測試計劃的核心目標高度一致,均致力于保障軟件的…

詳細介紹:網站背景更換功能

目錄 1. HTML 部分 2. JavaScript 部分 3. 完整流程 4. 總結 5. 適用場景 本文將介紹如何通過文件上傳實現網站背景圖片的更換。通過使用 JavaScript 和 Axios,我們可以允許用戶上傳圖片文件并將其作為網站的背景圖片。上傳的圖片 URL 會保存在瀏覽器的 localSt…

嵌入原則:數據特征如何 融入 模型的 損失地形

嵌入原則:數據特征如何 融入 模型的 損失地形 第一節:嵌入原則的基本概念與公式解釋 機器學習中的嵌入原則,就像 “雕刻師” 將 “石塊的紋理” 逐漸融入到 “雕塑的造型” 中。數據特征不再是獨立的輸入,而是被模型 “吸收” 和…

FPGA|例化生成的PLL功能IP核

1、例化上一篇文章中調用的IP核,新建文件PLL_test.v 2、代碼如圖 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…

【C++】P5734 【深基6.例6】文字處理軟件

博客主頁: [小????????] 本文專欄: C 文章目錄 💯前言💯題目描述💯題目描述輸入格式輸出格式示例輸入與輸出輸入:輸出: 💯我的做法操作1:在文檔末尾插入字符串操作2&…

后盾人JS -- 原型

沒有原型的對象 也有沒有原型的對象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

洛谷 P1130 紅牌 C語言

題目描述 某地臨時居民想獲得長期居住權就必須申請拿到紅牌。獲得紅牌的過程是相當復雜&#xff0c;一共包括 N 個步驟。每一步驟都由政府的某個工作人員負責檢查你所提交的材料是否符合條件。為了加快進程&#xff0c;每一步政府都派了 M 個工作人員來檢查材料。不幸的是&…

【線程】基于環形隊列的生產者消費者模型

1 環形隊列 環形隊列采用數組來模擬&#xff0c;用取模運算來模擬環狀特性。 1.如何判斷環形隊列為空或者為滿? 當環形隊列為空時&#xff0c;頭和尾都指向同一個位置。當環形隊列為滿時&#xff0c;頭和尾也都指向同一個位置。 因此&#xff0c; 可以通過加計數器或者標記…

二分/雙指針/單調棧隊列專題

1.4924. 矩陣 - AcWing題庫 一開始打表找規律以為是右上角向左下角遞增,但當n很大的時候就不對了,因此我們得去觀察 i * i 100000 * (i - j) j * j i * j 這個式子,我們關心的是這個式子的單調性因此我們可以分別將i和j看作常數來對式子進行求導,可以得到 f(i) 2 * i 10…

Shell $0

個人博客地址&#xff1a;Shell $0 | 一張假鈔的真實世界 我們已經知道在Shell中$0表示Shell腳本的文件名&#xff0c;但在有腳本調用的情形中&#xff0c;子腳本中的$0會是什么值呢&#xff1f;我們通過下面的實例來看。 已測試系統列表&#xff1a; Mac OS X EI Capitan 1…