C# 結構體與類的區別是什么?

結構體是值類型是儲存在棧中獨立儲存的,數據與數據之間不會相互影響,即使將一個結構體賦值給另外一個結構體也不會相互影響。

類是一個模板,實例出來的對象是獨立的不會相互影響,但是將一個對象賦值給另一個對象時 會把指向堆內存中數據的指針賦值給另一個對象.從而發生兩個變量指向同一個堆內存 一個修改數據 另外一個也修改。

目錄

1.?數據類型本質

2.?默認繼承行為

3.?實例化方式

4.?默認成員初始化

5.?構造函數特性

6.?內存管理與生命周期

7.?比較行為

8.?適用場景

總結對比表


在 C# 等面向對象編程語言中,結構體(Struct)和類(Class)是兩種重要的數據類型,它們在內存管理、行為特性等方面存在顯著區別。以下從多個維度詳細說明二者的核心差異:

1.?數據類型本質

  • 結構體(Struct):屬于值類型(Value Type),直接存儲數據本身。
    內存分配在棧(Stack)?上(或作為引用類型的一部分嵌入在堆中),當結構體變量被賦值、傳遞時,會創建完整的副本
  • 類(Class):屬于引用類型(Reference Type),存儲的是數據的引用(地址)。
    內存分配在堆(Heap)?上,變量僅保存指向堆中數據的指針,賦值或傳遞時僅復制引用(不會復制數據本身)。
  • 類實例化出的對象(即類的實例)存儲在堆(Heap)中,而指向該對象的引用(變量)則存儲在棧(Stack)中。

2.?默認繼承行為

  • 結構體:默認繼承自?System.ValueType(間接繼承自?object),但不能繼承其他類或結構體,也不能被其他類繼承( sealed 特性)。
    支持實現接口。
  • :默認繼承自?object可以繼承其他類(單繼承),也可以被其他類繼承(除非聲明為?sealed)。
    同樣支持實現接口。

3.?實例化方式

  • 結構體
    • 可以不使用?new?關鍵字實例化(此時成員變量為默認值,如?int?為 0)。
    • 例如:Point p; p.X = 10;Point?是結構體)。
    • 使用?new?時,會調用構造函數初始化成員。
    • 必須使用?new?關鍵字調用構造函數實例化(否則變量為?null,直接訪問成員會報錯)。
    • 例如:Person p = new Person();Person?是類)。

4.?默認成員初始化

  • 結構體
    • 不能在聲明時為成員變量設置默認值(需在構造函數中初始化)。
    • 例如:struct Point { public int X = 0; }(編譯錯誤)。
    • 可以在聲明時為成員變量設置默認值。
    • 例如:class Person { public int Age = 18; }(合法)。

5.?構造函數特性

  • 結構體
    • 無默認無參構造函數(編譯器不會自動生成,若手動定義構造函數,必須為所有成員賦值)。
    • 例如:struct Point { public int X; public Point(int x) { X = x; } }(合法,因初始化了所有成員)。
    • 編譯器會自動生成默認無參構造函數(若未手動定義任何構造函數)。
    • 可以定義有參構造函數,且無需顯式初始化所有成員(未初始化的成員為默認值)。

6.?內存管理與生命周期

  • 結構體
    • 生命周期與所在作用域一致(如方法內的結構體變量,方法執行結束后棧內存自動釋放)。
    • 無需垃圾回收(GC),性能開銷較低(適合小型數據結構)。
    • 實例在堆上分配,生命周期由 GC 管理(當沒有引用指向時,會被 GC 回收)。
    • 存在 GC 開銷,適合大型、復雜的對象(如業務實體)。

7.?比較行為

  • 結構體
    • 默認按值比較(比較所有成員是否相等)。
    • 例如:兩個?Point?結構體,若?X?和?Y?分別相等,則認為相等。
    • 默認按引用比較(比較是否指向堆中同一個實例)。
    • 例如:兩個?Person?類實例,即使成員完全相同,若引用不同則認為不相等(需重寫?Equals?方法實現值比較)。

8.?適用場景

  • 結構體
    • 適合表示小型、簡單的數據(如坐標?Point、顏色?Color、日期?DateTime?等)。
    • 強調數據的值語義(傳遞時需要副本),且無需繼承或多態特性。
    • 適合表示復雜的對象(如?UserOrder?等業務實體)。
    • 需要繼承、多態,或實例較大、需要長期存在(通過引用共享)的場景。

總結對比表

特性結構體(Struct)類(Class)
數據類型值類型引用類型
內存分配棧(或嵌入堆)
賦值 / 傳遞行為復制值(副本)復制引用(共享實例)
繼承不能繼承 / 被繼承(除接口)支持繼承和被繼承
實例化可省略?new必須用?new
成員默認值不允許聲明時初始化允許聲明時初始化
構造函數無默認無參構造函數,需初始化所有成員有默認無參構造函數,可部分初始化
比較方式默認值比較默認引用比較
適用場景小型簡單數據,值語義復雜對象,引用語義,需繼承多態

通過以上區別可以看出,結構體和類的選擇主要取決于數據的復雜度、是否需要共享引用以及是否依賴繼承多態等特性。

C# 結構體https://blog.csdn.net/LZQqqqqo/article/details/149511030?spm=1001.2014.3001.5502C# 面向對象__類_對象https://blog.csdn.net/LZQqqqqo/article/details/149546454?spm=1001.2014.3001.5502

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

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

相關文章

Redis GEO

Redis GEO 引言 Redis 是一款高性能的鍵值存儲系統,廣泛應用于緩存、消息隊列等領域。Redis GEO 是 Redis 2.4 版本后新增的一個功能,用于存儲地理位置信息。本文將詳細介紹 Redis GEO 的概念、使用方法以及應用場景。 什么是 Redis GEO? Redis GEO 是 Redis 的一個模塊…

Go從入門到精通系列學習路線規劃

Go從入門到精通系列學習路線規劃 目錄導航 Go從入門到精通系列學習路線規劃首頁說明 第1篇_Go語言初探_環境搭建與HelloWorld 第2篇_Go語言基礎語法_變量常量與數據類型 第3篇_Go語言控制結構_條件判斷與循環 第4篇_Go語言函數詳解 第5篇_Go語言數據結構詳解 第6篇_Go語言結構體…

Grid系統概述

目錄 概念及功能 網格對象(Grid Object) 和世界對象(World Object) 工作流程 概念及功能 TrinityCore 的 Grid 系統是一套復雜的地圖分區管理機制,其核心目標是通過動態管控游戲世界的區域狀態和對象生命周期&#…

一文搞懂LLM大模型!LLM從入門到精通萬字長文(2024.12月最新)

LLM從入門到精通精品文章 目錄 一、LLM基本概念 二、LLM發展歷程 三、LLM大模型的分類 四、LLM主流大模型類別 五、LLM大模型建立的流程 六、Fine-Tuning 七、Prompt-Tuning 八、超大規模參數模型Prompt-Tuning方法 8.1上下文學習 In-Context Learning 8.2.指令學習 …

Next.js跟React關系(Next.js是基于React庫的全棧框架)(文件系統路由、服務端渲染SSR、靜態生成SSG、增量靜態再生ISR、API路由)

文章目錄**1. React 是基礎,Next.js 是擴展****2. Next.js 解決了 React 的哪些痛點?****3. 核心區別****4. Next.js 的核心特性**1. **文件系統路由**2. **服務端渲染(SSR)**3. **靜態生成(SSG)**4. **增量…

Nightingale源碼Linux進行跨平臺編譯

最近使用Nightingale 需要實現對服務的監測,想要在Windows 系統中使用,看官方文檔中并不直接提供執行程序,原文如下: 準備工作 本地環境 本地已經安裝git 本地安裝git 便于后續下載源碼并進行自動編譯。 Linux操作系統環境&…

抽絲剝繭丨PostgreSQL 系國產數據庫%SYS CPU newfstatat() high 調優一例(二)

續接上回《PostgreSQL 系國產數據庫%SYS CPU newfstatat() high 調優一例(一)》,這個問題還在持續,并且原因并不只是一個,從調了文件系統級atime,到調整wal size減少日志被動清理,還有在驗證tem…

【新手入門】Android Studio 項目結構拆解,快速理解文件作用!

目 錄 一、【Project】視圖下項目結構(真實目錄) 二、【Android】視圖下項目結構 三、【app/】下重要文件解析 1、 build.gradle 2、AndroidManifest.xml 3、res/ 作為剛剛接觸Android開發的小白,使用Android Studio創建項目后&…

Python實現點云Kmeans、歐式和DBSCAN聚類

本節我們分享點云處理中的三種常見聚類方法,分別是K-means、歐氏與 DBSCAN聚類。具體介紹如下:1. K-means 聚類定義:一種基于距離度量的無監督學習算法,將數據劃分為 K 個緊湊的簇,使簇內數據相似度高、簇間差異大。算…

【Java后端】MyBatis-Plus 原理解析

MyBatis-Plus 原理解析 其實 MyBatis-Plus 的 Service 層設計就是為了讓開發者不用重復寫很多樣板代碼。我們來一點點剖析 UserServiceImpl、IService、UserService、ServiceImpl 之間的關系和調用鏈。1. 類/接口關系圖IService<T>▲│UserService (接口) <-- 自定義…

Nacos 注冊中心學習筆記

&#x1f389; Alibaba微服務組件 Nacos 注冊中心超詳細學習筆記 &#x1f389; &#x1f4cc; 寫在前面&#xff1a;本文基于官方PDF文檔與實戰經驗&#xff0c;整理了Nacos注冊中心的核心知識點、部署流程與實戰技巧&#xff0c;力求圖文并茂、通俗易懂&#xff0c;適合收藏反…

java 策略模式 demo

策略模式介紹策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;將每個算法封裝起來并使它們可相互替換。策略模式讓算法的變化獨立于使用算法的客戶端&#xff0c;從而實現靈活的算法切換。核心角色&#xff1…

SAP Valuation Category在制造業成本核算中的使用場景與配置方案

Valuation Category在制造業成本核算中的使用場景與配置方案一、核心使用場景&#xff08;制造業特有&#xff09;1. 內制 vs 外購成本分離業務需求&#xff1a;同一物料可能通過內部生產&#xff08;成本含料工費&#xff09;或外部采購&#xff08;成本含采購價運費&#xff…

我的 LeetCode 日記:Day 36 - 動態規劃,背包問題的千變萬化

昨天&#xff0c;我初步掌握了 0/1 背包問題的理論基礎和標準解法。今天&#xff0c;我將這種思想應用到了更廣泛的場景中。今天的幾道題&#xff0c;乍一看和背包沒什么關系&#xff0c;但通過巧妙的數學轉化&#xff0c;它們的核心都變成了 0/1 背包問題。 這讓我深刻體會到…

本地處理不上傳!隱私安全的PDF轉換解決方案

PDF能鎖定排版、字體、圖片位置&#xff0c;無論在什么設備打開都保持一致。它是無廣告、簡潔高效的專業PDF處理工具。功能豐富&#xff0c;支持批量操作&#xff1a;只需將文件拖入界面&#xff0c;選擇目標格式&#xff08;如Word、PPT、Excel、圖片等&#xff09;&#xff0…

Docker build創建鏡像命令入門教程

一、核心概念Dockerfile 定義鏡像構建步驟的文本文件&#xff0c;包含一系列指令和配置&#xff0c;用于自動化創建鏡像。鏡像層&#xff08;Layer&#xff09; Docker 鏡像由多層只讀層疊加而成&#xff0c;每個指令&#xff08;如 RUN、COPY&#xff09;會生成一個新的層。層…

Redis 是單線程模型嗎?

最近在面試中經常被問到這個問題&#xff1a;"Redis是單線程的嗎&#xff1f;"很多同學都會脫口而出&#xff1a;"是的&#xff01;"但其實這個答案并不完全正確。今天我們就來聊聊Redis的線程模型&#xff0c;把這個問題徹底搞清楚。 先說結論 Redis的線程…

Hologres實戰:路徑分析函數

前言 Hologres提供了一套高效的路徑分析函數&#xff0c;包括路徑明細計算和結果解析功能&#xff0c;能夠幫助用戶深入理解用戶行為路徑&#xff0c;并通過桑基圖實現數據可視化。 一、核心功能 路徑明細計算&#xff1a;精確記錄用戶在產品或功能中的完整訪問路徑結果解析…

產品開發實踐(常見的軟硬結合方式)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】前面說過&#xff0c;傳統的純軟件開發&#xff0c;在國內的大背景下面是很難存活的。但是如果是把軟件&#xff0c;構建在硬件基礎之上&#xff0c…

Linux | i.MX6ULL網絡通信-套字節 UDP(第十八章)

01 Linux | i.MX6ULL網絡通信-套字節 TCP(第十七章) 02 iTOP-IMX6ULL 實現基于 UDP 的 socket 編程。