C#結構體(Struct)詳解

在 C# 中,?結構體(struct)? 是一種值類型數據類型,適用于封裝小型數據組。與類(class)不同,結構體在棧(Stack)上分配內存,且賦值時會發生值復制。以下是結構體的核心特性和用法:


?結構體核心特點?
結構提供了一種輕量級的數據類型,適用于表示簡單的數據結構,具有較好的性能特性和值語義:

  • 值類型?:賦值時復制整個數據,修改副本不影響原數據。
  • 結構可帶有方法、字段、索引、屬性、運算符方法和事件,適用于表示輕量級數據的情況,如坐標、范圍、日期、時間等。
  • 結構可定義構造函數,但不能定義析構函數。但是,您不能為結構定義無參構造函數。無參構造函數(默認)是自動- 定義的,且不能被改變(C# 10 前不能定義無參構造器,所有字段需在構造器中初始化。)。
  • 與類不同,結構不能繼承其他的結構或類。
  • 結構不能作為其他結構或類的基礎結構。
  • 結構可實現一個或多個接口。
  • 結構成員不能指定為 abstract、virtual 或 protected。
  • 當您使用 New 操作符創建一個結構對象時,會調用適當的構造函數來創建結構。與類不同,結構可以不使用 New 操作符即可被實例化。
  • 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被賦值,對象才被使用。
  • 結構變量通常分配在棧上,這使得它們的創建和銷毀速度更快。但是,如果將結構用作類的字段,且這個類是引用類型,那么結構將存儲在堆上。
  • 結構默認情況下是可變的,這意味著你可以修改它們的字段。但是,如果結構定義為只讀,那么它的字段將是不可變的。

?結構體 vs 類?

特性結構體(struct)類(class)
類型值類型(棧內存)引用類型(堆內存)
繼承不支持支持
默認構造器C# 10 前無隱式無參構造器有隱式無參構造器
賦值行為復制值復制引用
適用場景小型、頻繁創建的數據復雜對象、需要繼承的場景

?結構體定義示例?

public struct Point
{public int X;public int Y;// C# 10+ 允許顯式無參構造器public Point(){X = 0;Y = 0;}public Point(int x, int y){X = x;Y = y;}public void Print() => Console.WriteLine($"({X}, {Y})");
}

?使用結構體?

// 創建結構體實例
Point p1 = new Point(10, 20);
Point p2 = p1; // 值復制p2.X = 30;     // 修改副本不影響原數據
p1.Print();     // 輸出: (10, 20)
p2.Print();     // 輸出: (30, 20)// 使用無參構造器(C# 10+)
Point p3 = new Point();
p3.Print();     // 輸出: (0, 0)

?何時使用結構體??

  1. 數據量小?:字段較少(通常少于 16 字節)。
  2. 不可變需求?:設計為不可變類型(所有字段只讀)。
  3. ?避免裝箱?:減少值類型與引用類型轉換的性能損耗。
  4. ?高頻實例化?:如游戲中的坐標計算,減少堆內存壓力。

?注意事項?

  • 避免大型結構體?:復制成本高,可能降低性能。
  • ?慎用可變結構體?:修改副本可能導致預期外的行為。
  • ?構造器必須初始化所有字段?:否則編譯報錯。
  • ?實現接口需謹慎?:可能導致裝箱操作(將結構體轉為 object 或接口類型時)。

通過合理使用結構體,可以優化內存分配和程序性能,但需根據場景權衡值與引用類型的優缺點。

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

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

相關文章

UVC攝像頭命令推流,推到rv1126里面去

ffmpeg命令查詢UVC設備 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上圖是查詢UVC設備的效果圖,畫紅框的部分是UVC設備的設備名稱"USB2.0 PC CAMERA"和設備號 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…

Linux中的基本指令(上)

目錄 ls指令 判斷linux中文件 pwd指令 認識路徑 ?編輯 絕對路徑/相對路徑 cd指令 簡要理解用戶 理解家目錄 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

多數元素——面試經典150題(力扣)

題目 給定一個大小為 n 的數組 nums ,返回其中的多數元素。多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。 你可以假設數組是非空的,并且給定的數組總是存在多數元素。 示例 1: 輸入:nums [3,2,3] 輸出:3 …

Qt 數據庫操作(Sqlite)

數據庫簡介 關于數據庫的基礎知識這里就不做介紹了,相關博客可以查看: SQL基礎知識 數據庫學霸筆記 上面博客都寫的比較詳細,本文主要介紹如何使用Qt進行數據庫相關操作,數據庫分為關系型數據庫和非關系型數據,關系…

網絡安全 api 網絡安全 ast技術

隨著應用或者API被攻擊利用已經越來越多,雖然來自開源組件的漏洞加劇了這一現象的發生,但是,其實主要還是在于應用程序或者API本身沒有做好防范,根源在于源代碼本身的質量沒有嚴格把控。AST是指Application Security Testing&…

Mac 配置 Maven JDK

不使用 Homebrew,創建指定版本 JDK 1、官網下載指定版本并安裝……省略 2、vi ~/.zshrc 同時要檢查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

【每日學點HarmonyOS Next知識】拖拽調整列表順序、tab回彈、自定義彈窗this、狀態變量修飾枚舉

1、HarmonyOS 功能實現(拖拽調整列表順序)? 可參考: import curves from ohos.curves; import Curves from ohos.curvesEntry Component struct ListItemExample {State private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]…

Django部署Filemanagement

Pycharm搭建項目安裝虛擬環境 mysqlclient對mysql的安裝,配置有要求 pymsql偽裝成mysqlclient,pymysql可以操縱mysql pip install pymysql操作sql5.7 mysql8.0會出現與pycharm不兼容問題,會報錯,所以降到5.7 # 進入mysql 需要…

【病毒分析】熊貓燒香病毒分析及其查殺修復

目錄 前言 一、樣本概況 1.1 樣本信息 1.2 測試環境及工具 1.3 分析目標 二、具體行為分析 2.1 主要行為 2.1.1 惡意程序對用戶造成的危害 2.2 惡意代碼分析 2.2.1 加固后的惡意代碼樹結構圖(是否有加固) 2.2.2 惡意程序的代碼分析片段 三、解決方案(或總結) 3.1 …

Spring Boot集成Spring Statemachine

Spring Statemachine 是 Spring 框架下的一個模塊,用于簡化狀態機的創建和管理,它允許開發者使用 Spring 的特性(如依賴注入、AOP 等)來構建復雜的狀態機應用。以下是關于 Spring Statemachine 的詳細介紹: 主要特性 …

數組總和 (leetcode 40

leetcode系列 文章目錄 一、核心操作二、外層配合操作三、核心模式代碼總結 去重方式和之前三數之和一樣,也可以用used數組去重,但本次嘗試使用set去重 一、核心操作 如果count為0了,則證明正好減到了0,就可以收獲,…

sqli-lab靶場學習(八)——Less26-28

前言 25關已經出現了初步的一些關鍵字過濾,通過雙寫可以繞過。后面的關卡,我們會遇到更多關鍵字過濾,需要各種技巧繞過。 Less26 第26關寫了會過濾空格和注釋符。有很多的答案,會用%a0替代空格,但據說這是sqli-labs部…

python:VOC格式數據集轉換為YOLO數據集格式

作者:CSDN _養樂多_ 本文將介紹如何將目標檢測中常用的VOC格式數據集轉換為YOLO數據集,并進行數據集比例劃分,從而方便的進行YOLO目標檢測。 如果不想分兩步,可以直接看第三節代碼。 文章目錄 一、將VOC格式數據集轉換為YOLO格…

Docker容器安裝軟件(完整版)

文章目錄 一、安裝Docker1.1 docker 相關的命令1.2 配置鏡像加速 二. 安裝es2.1 創建網絡2.2 拉取鏡像2.3 創建掛載點目錄2.4 部署單點es,創建es容器2.5 編寫elasticsearch.yml2.6 重啟es容器2.7 測試Elasticsearch是否安裝成功 三. 基于Docker安裝Kibana3.1 拉取鏡…

LINUX 指令大全

Linux服務器上有許多常用的命令,可以幫助你管理文件、目錄、進程、網絡和系統配置等。以下是一些常用的Linux命令: 文件和目錄管理 ls:列出當前目錄中的文件和子目錄 bash lspwd:顯示當前工作目錄的路徑 bash pwdcd:切…

燃氣對我們生活的重要性體現在哪里?

燃氣在我們的生活中有 多方面的重要性 ,以下是燃氣對我們生活的重要性的詳細說明: 烹飪和熱水供應 : 燃氣是家庭烹飪的主要能源,能夠快速、高效地加熱食物,使家庭聚餐更加便捷和愉快。 燃氣熱水器能夠在短時間內提供…

NetAssist 5.0.14網絡助手基礎使用及自動應答使用方案

以下是NetAssist v5.0.14自動應答功能的詳細使用步驟: 一、基礎準備: 工具下載網址頁面:https://www.cmsoft.cn/resource/102.html 下載安裝好后,根據需要可以創建多個server,雙擊程序圖標運行即可,下面…

node.js-node.js作為服務器,前端使用WebSocket(單個TCP連接上進行全雙工通訊的協議)

1.WebSocket全雙工通信協議 WebSocket是HTML5開始提供的一種單個TCP連接上進行全雙工通訊的協議。讓客戶端和服務器間的數據交互變得簡單,允許服務端向客戶端主動推送數據。瀏覽器和服務器間只需要完成一次握手,兩者間創建持久性的連接,并進行…

java后端開發day31--集合進階(一)-----Collection集合List集合數據結構1

(以下內容全部來自上述課程) 1.集合體系結構 List系列集合:添加的元素是有序、可重復、有索引。 Set系列集合:添加的元素是無序、不重復、無索引。 2.Collection集合 Collection是單列集合的祖宗接口(不可直接創建…

Qt配置OpenGL相機踩的坑

項目根據LearnOpenGL配置Qt的相機,更新view矩陣和project矩陣的位移向量變得很大,我設置的明明相機位置是(0,0,3),理想的位移向量剛好是相反數(0,0,-3),對應的view矩陣位置向量可以變成(0,0,1200)…離模型非常遠矩陣模型也看不見&…