C# 結構體 和 類 的區別

? 結構體(struct)是值類型(Value Type)

和類(class)不同,結構體在賦值和傳參時是復制值本身,而不是引用地址。


? 一、結構體的基本使用示例:

using System;struct Point
{public int X;public int Y;public Point(int x, int y)  // 構造函數{X = x;Y = y;}public void Print(){Console.WriteLine($"X = {X}, Y = {Y}");}
}class Program
{static void Main(){Point p1 = new Point(3, 4);Point p2 = p1;  // 值復制p2.X = 100;p1.Print();  // 輸出: X = 3, Y = 4p2.Print();  // 輸出: X = 100, Y = 4}
}

🔍 說明

  • p2 = p1值復制,修改 p2.X 不影響 p1.X

  • 如果是類,就會出現兩個變量共享一份數據的情況。


? 二、結構體和類的區別(簡要對比):

特性結構體(struct)類(class)
類型值類型引用類型
存儲堆棧上堆上
繼承不支持繼承支持繼承
默認構造函數不可自定義無參構造函數可以定義任意構造函數
分配性能更快相對較慢(需要GC)


? 三、結構體使用場景

結構體適合表示小型的、行為簡單的數據對象,比如:

  • 坐標(Point)

  • 顏色(Color)

  • 時間(DateTime)

  • 金額(Money)


? 四、使用場景擴展:結構體作為方法參數

struct Size
{public int Width;public int Height;public Size(int w, int h){Width = w;Height = h;}
}class Program
{static void ModifySize(Size s){s.Width = 999;}static void Main(){Size mySize = new Size(100, 200);ModifySize(mySize);Console.WriteLine(mySize.Width);  // 結果仍是 100,未被修改}
}

🔍 原因:傳值類型是拷貝副本,函數內修改不會影響原始變量。


? 五、ref 修飾結構體參數(傳引用)

static void ModifySize(ref Size s)
{s.Width = 999;
}static void Main()
{Size mySize = new Size(100, 200);ModifySize(ref mySize);Console.WriteLine(mySize.Width);  // 現在是 999,修改生效
}

補充:

Q:結構體既然不可自定義無參構造函數,那么它的無參構造函數是真實存在的嗎?

A:

? 結論先行:

在 C# 中,結構體確實有一個無參構造函數但它是編譯器自動生成的,不允許你自定義或重寫(在 .NET Framework 和 .NET Core/.NET 5 之前如此;.NET 6 起有例外,見后面)。?


? 一、為什么結構體有無參構造函數?

結構體是值類型,值類型在聲明后必須被賦予一個確定的值,所以:

  • C# 編譯器會默認生成一個“全字段為默認值”的無參構造函數

  • 你不能自己定義一個無參構造函數(除非是 .NET 6+ 且加 public)。


? 二、演示:結構體的默認構造行為

struct MyStruct
{public int X;public int Y;
}class Program
{static void Main(){MyStruct s = new MyStruct();  // 編譯通過!Console.WriteLine($"{s.X}, {s.Y}");  // 輸出: 0, 0}
}

即使你沒定義構造函數,new MyStruct() 會把所有字段初始化為默認值(int → 0)。


? 三、不能自定義無參構造函數(.NET 6 前)

下面這個寫法在 .NET 5 或更早版本中會報錯

struct MyStruct
{public int X;// ? 編譯錯誤:結構體不能包含無參數的構造函數public MyStruct()  {X = 1;}
}

錯誤信息(翻譯):

錯誤 CS0568:結構體不能定義顯式的無參數構造函數

真實報錯如圖 VS2022 .NET5

同樣的代碼改成 .NET8 框架就沒事了,允許定義無參構造函數,如圖。


? 四、.NET 6 起的新特性(允許定義無參構造函數)

.NET 6 / C# 10 起,你可以寫:

struct MyStruct
{public int X;// ? .NET 6+ 支持!public MyStruct(){X = 42;}
}

但要注意:

  • new MyStruct() 現在會調用你自定義的構造函數,而不是“全 0 初始化”。

  • 只有在啟用了 .NET 6+ 項目環境和編譯器才能生效。


? 五、如果結構體不使用 new 會怎樣?

MyStruct s;
s.X = 10; // ? 合法
Console.WriteLine(s.X); // 10

注意:

  • 不用 new 就要 手動初始化所有字段,否則不能訪問它。

? 總結一下:

特性說明
是否有無參構造函數有,編譯器默認生成,字段為默認值(int 為 0)
能否自定義無參構造函數? 在 .NET 6 前不可以;? .NET 6 起可以
默認構造函數會干嘛初始化所有字段為類型默認值
new struct() vs 不用 newnew:所有字段變為默認值;不用 new:必須手動賦值所有字段

?


補充2:

Q:既然結構體不能被繼承,那結構體能繼承類或者接口嗎?

? 結論:

能否繼承答案
結構體能繼承類嗎? 不能
結構體能被繼承嗎? 不能(sealed)
結構體能繼承接口嗎? 可以

? 一、結構體不能繼承類,也不能被繼承

struct MyStruct : MyBaseClass  // ? 錯誤:結構體不能繼承類
{
}

會報錯:

錯誤 CS0527: 'MyStruct': 結構體不能從類 'MyBaseClass' 繼承

因為:

  • 結構體是值類型,不支持類的繼承鏈結構

  • 結構體在 CLR(公共語言運行庫)中是 sealed 的


? 二、結構體可以實現接口 ?

interface IPrintable
{void Print();
}struct MyStruct : IPrintable
{public int Value;public void Print(){Console.WriteLine($"Value = {Value}");}
}class Program
{static void Main(){MyStruct s = new MyStruct { Value = 123 };s.Print();  // 輸出:Value = 123// 也可以通過接口調用IPrintable printable = s;printable.Print();  // 仍然輸出:Value = 123}
}

?? 三、結構體實現接口的注意事項(值類型封裝拆箱問題)

結構體是值類型,如果你將它轉換成接口類型,會發生裝箱(Boxing),性能上會有一些開銷:

IPrintable printable = s; // ?? 會進行裝箱,把值類型放到堆上

? 四、總結對比:

特性類(class)結構體(struct)
是否值類型否(引用類型)? 是
是否能繼承類? 可以? 不可以
是否能實現接口? 可以? 可以
是否能被繼承? 可以? 不可以(sealed)
是否支持虛方法? 可以? 不能虛方法/override(除非顯示接口實現)

Q:sealed 是什么?

英/si?ld/
adj.密封的;未知的

A:sealed 是 C# 中用于控制 繼承 的關鍵字,主要用于防止類被繼承。


? 一、sealed 是什么?

sealed 修飾符表示這個類(或方法)不能被繼承或重寫


? 二、語法示例:

🔹1. 阻止類被繼承

sealed class Animal
{public void Speak() => Console.WriteLine("Animal sound");
}// ? 錯誤:不能從密封類繼承
class Dog : Animal { } // 編譯錯誤

📌 報錯信息:

錯誤 CS0509:無法從密封類型 'Animal' 派生

報錯如圖:?


🔹2. 阻止方法被重寫(配合 override

你也可以用 sealed 修飾繼承鏈中的方法,阻止再被 override:

class Animal
{public virtual void Speak() => Console.WriteLine("Animal");
}class Dog : Animal
{public sealed override void Speak() => Console.WriteLine("Dog");
}class Husky : Dog
{// ? 錯誤:Speak 已 sealed,不能重寫// public override void Speak() => Console.WriteLine("Husky");
}

?? 三、結構體默認是 sealed 嗎?

是的!

struct MyStruct { }
  • 結構體(struct)默認就是 sealed,不能繼承

  • 所以你 不能在 struct 上顯示寫 sealed,否則會報錯。


?? 四、sealed 的實際應用場景

應用場景說明
安全性防止別人繼承你寫的類(尤其是框架庫)
性能優化JIT 編譯器可以優化 sealed 方法的調用路徑(非虛調用)
明確設計意圖告訴使用者這個類不能被擴展或重寫

? 五、sealed 與 abstract 是對立的嗎?

是的,sealed 表示“不能被繼承”,而 abstract 表示“必須被繼承”。

修飾符含義
sealed不能被繼承
abstract必須被繼承
sealed abstract? 不能一起用,語義沖突

?

? 總結一句話:

sealed 是用于禁止繼承或重寫的關鍵字,常用于類或方法上。結構體本身默認就是 sealed 的,不能被繼承。

?

?

僅供學習參考,如有侵權聯系我刪除。

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

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

相關文章

MacBook Air M4 安裝 VMware Fusion Pro

VMware Fusion Pro已經對消費者免費了,在Windows系統上的安裝和使用教程比較多,Mac上竟然沒多少,還充斥著大量的廣告以及付費軟件,所以趁著今天要安裝虛擬機,記錄一下完整過程。 1,注冊博通賬號與登錄 首…

vue的優缺點

Vue的優點輕量級框架 Vue的核心庫僅關注視圖層,體積小巧(約20KB),加載速度快,適合快速開發小型到中型項目。易于上手 文檔清晰且中文友好,API設計簡潔,學習曲線平緩。熟悉HTML、CSS和JavaScript…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第七課——獲取RAW圖像

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…

在前端項目中是如何解決跨域的

📘 前端項目中跨域問題及解決方式詳解(Vite 項目)一、🌐 什么是跨域?跨域(Cross-Origin) 指的是在瀏覽器中,前端頁面與服務器之間的協議、域名或端口不一致而引發的安全限制。? 瀏覽…

代碼審計-Struts2漏洞分析

一、Struts2介紹 Struts2 是一個基于 MVC(Model-View-Controller) 設計模式的開源 Java Web 應用框架,由 Apache 軟件基金會維護。它是 Struts1 和 WebWork 框架的整合產物,以 WebWork 為核心,通過攔截器機制實現業務邏…

三、神經網絡——網絡優化方法

三、網絡優化方法 1.梯度下降算法梯段下降算法是一種尋找使損失函數最小化的方法,從數學上的角度來看,梯度的方向是函數增長速度最快的方向,那么梯度的反方向就是函數減少最快的方向,所以有WijnewWijold?η?E?WijW_{ij}^{new} …

HTML/JOSN復習總結

HTML 基礎 什么是 HTML? 1.HTML是一門語言,所有的網頁都是用HTML這門語言編寫出來的 2.HTML(HyperText Markup Language):超文本標記語言。 >超文本:超越了文本的限制,比普通文本更強大。除了文字信息,還可以定義圖片、音頻、視頻等內…

Golang中的內置類型

A. int B. string C. struct D. array 首先,內置類型是指不需要引入任何關于這些數據類型的包,就可以引用的數據類型。那么,內置類型主要包括基本類型,復合類型,控制并發,高級抽象,特殊類型。…

通過命名空間引用了 Application 類,php不會自動包含路徑文件嗎?

示例代碼:報錯提示找不到Application類 use mvc\core\Application;$app new Application(); // 定義路由 $app->get(/, HomeControllerindex); $app->get(/user, UserControllershow); $app->post(/user, UserControllercreate);// 運行應用 $app->run…

PlantUML 基礎使用技術文檔

目錄 摘要 1. 什么是 PlantUML 2. 安裝與環境配置 2.1 本地使用 2.2 在線使用 3. 基本語法 3.1 示例:系統架構圖 3.2 常用元素 4. 渲染方式 4.1 VSCode 4.2 在線渲染 4.3 生成圖片 5. 推薦實踐 6. 常見圖類型 7. 進階功能 8. 典型應用場景 摘要 Pl…

Android Notification 通過增加addAction 跳轉回Service重新執行邏輯

1.場景描述在App內升級過程中,apk下載過程中網絡波動導致連接超時,下載失敗后Service生命周期結束。前臺通知也被清除。2.解決思路在通知欄中增加重試按鈕重啟下載服務。3.代碼NotificationManager mNotificationManager (NotificationManager) getSy…

帶貨視頻評論的用戶洞察 科大訊飛AI算法賽 Datawhale AI夏令營

賽題 2025 iFLYTEK AI開發者大賽https://challenge.xfyun.cn/topic/info?typevideo-comment-insight 一、賽事背景 在電商直播爆發式增長的數字化浪潮下,短視頻平臺積累了海量帶貨視頻及用戶互動數據。這些數據不僅是消費者對商品體驗的直接反饋,更蘊…

JAVA生成PDF(itextpdf)

java生成PDF有多種方式&#xff0c;比如itextpdf、 Apache PDFBox、Flying Saucer (XHTMLRenderer)、 OpenPDF等。今天要介紹的是itextpdf&#xff0c;及在開發過程中處理的問題。1. 引入POM<!--PDF導出POM--><dependency><groupId>com.itextpdf</groupId…

[爬蟲知識] 深入理解多進程/多線程/協程的異步邏輯

相關爬蟲實戰案例&#xff1a;[爬蟲實戰] 多進程/多線程/協程-異步爬取豆瓣Top250 相關爬蟲專欄&#xff1a;JS逆向爬蟲實戰 爬蟲知識點合集 爬蟲實戰案例 逆向知識點合集 前言&#xff1a; 面對海量的目標數據&#xff0c;傳統單線程、同步的爬取方式往往效率低下&#x…

Oracle RAC 11.2.0.4 更新SYSASM和SYS密碼

前言 從技術角度看&#xff0c;SYSASM是Oracle 10g R2引入的ASM管理員角色&#xff0c;而SYS是數據庫實例的超級用戶&#xff0c;SYS賬戶無法管理ASM磁盤組。SYSASM權限是集群級別的&#xff0c;比如在添加磁盤組時&#xff0c;這個操作會影響所有節點&#xff1b;而SYS用戶的權…

Vue》》總結

官網 vue路由的query參數、mixin 混入 vue cli 腳手架之配置代理 VUE SAP、 MPA&#xff0c;&#xff0c;組件開發、VDOM、雙向數據綁定 Vue Props 、Mixin 、路由守衛 vue router query參數 Vue props以及其他通信方式, vue響應式 原理 追加響應式數據&#xff0c;數組響應式 …

Nginx 中的負載均衡策略

Nginx 是一個高性能的 HTTP 和反向代理服務器&#xff0c;廣泛用于負載均衡場景。它支持多種負載均衡策略&#xff0c;可以幫助你優化資源利用、提高響應速度和增加系統的可用性。以下是 Nginx 中幾種常見的負載均衡策略及其配置方法&#xff1a; 1. 輪詢&#xff08;Round Rob…

用 Python 將分組文本轉為 Excel:以四級詞匯為例的實戰解析

一、背景引入&#xff1a;從“人工整理”到“自動化處理”的轉變 在英語學習過程中&#xff0c;我們經常會接觸各種分組整理的詞匯表&#xff0c;比如“Group1”對應一組單詞及釋義&#xff0c;隨后是“Group2”、“Group3”等等。如果你下載了一個 .txt 格式的四級詞匯表&…

Ffmpeg濾鏡

打開設備 添加濾鏡 循環錄制文件 #include "libavdevice/avdevice.h" #include "libavformat/avformat.h" #include "libavcodec/avcodec.h" #include "libavfilter/avfilter.h" #include "libavfilter/buffersink.h" #incl…

HarmonyOS AI輔助編程工具(CodeGenie)UI生成

UI Generator基于BitFun Platform AI能力平臺&#xff0c;用于快速生成可編譯、可運行的HarmonyOS UI工程&#xff0c;支持基于已有UI布局文件&#xff08;XML&#xff09;&#xff0c;快速生成對應的HarmonyOS UI代碼&#xff0c;其中包含HarmonyOS基礎工程、頁面布局、組件及…