c# Struct的一些問題分析
Struct的理論看過好一些,可是工作上基本沒有應(yīng)用過,Class倒處處都有。難道Struct就沒有什么使用價(jià)值嗎?搜了一下如何在類和結(jié)構(gòu)中做出選擇?
✔️ 如果類型的實(shí)例很小且通常壽命很短或通常嵌入其他對(duì)象中,請(qǐng)考慮定義結(jié)構(gòu)而不是類。
❌ 避免定義結(jié)構(gòu),除非該類型具有以下所有特征:
它在邏輯上表示單個(gè)值,類似于原始類型(int,double等)。
它的實(shí)例大小低于 16 字節(jié)。
它是不可變的。
它不必經(jīng)常裝箱。
在開發(fā)軟件時(shí),常常會(huì)有頁面彈窗,而主頁面經(jīng)常需要傳一些參數(shù)到窗體里面,窗體也只是用這些參數(shù)來搜出其他數(shù)據(jù)展示,或進(jìn)行數(shù)據(jù)保存時(shí)使用,也就是只讀那些入?yún)?。雖然通過構(gòu)造函數(shù)傳參,可以傳多個(gè)參數(shù),但一般多個(gè)參數(shù)還是封裝為一個(gè)整體較好,如果這些參數(shù)在業(yè)務(wù)上可以看成一個(gè)小的邏輯單元,封裝成Struct應(yīng)該更好。
eg:函數(shù)傳參,struct會(huì)多復(fù)制一遍,所以加上ref。
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { private FundStruct s_fundStruct; public Form1() { InitializeComponent(); } public Form1(ref FundStruct fundStruct) { InitializeComponent(); s_fundStruct = fundStruct; } private void Form1_Load(object sender, EventArgs e) { this.textBox1.Text = s_fundStruct.Code; this.textBox2.Text = s_fundStruct.ShortName; ... } } public struct FundStruct { /// <summary> /// 編碼 /// </summary> internal readonly string Code; /// <summary> /// 內(nèi)碼編號(hào) /// </summary> internal readonly int Number; /// <summary> /// 簡稱 /// </summary> internal readonly string ShortName; /// <summary> /// 全稱 /// </summary> internal readonly string LongName; internal FundStruct(string code, int number, string shortName, string longName) { Code = code ?? throw new ArgumentNullException(nameof(code)); Number = number; ShortName = shortName ?? throw new ArgumentNullException(nameof(shortName)); LongName = longName ?? throw new ArgumentNullException(nameof(longName)); } } }
與類的區(qū)別:
C# 中結(jié)構(gòu)類型和類類型在語法上非常相似,他們都是一種數(shù)據(jù)結(jié)構(gòu),都可以包括數(shù)據(jù)成員和方法成員。
結(jié)構(gòu)和類的區(qū)別:
1、結(jié)構(gòu)是值類型,它在棧中分配空間;而類是引用類型,它在堆中分配空間,棧中保存的只是引用。
2、結(jié)構(gòu)類型直接存儲(chǔ)成員數(shù)據(jù),讓其他類的數(shù)據(jù)位于堆中,位于棧中的變量保存的是指向堆中數(shù)據(jù)對(duì)象的引用。
C# 中的簡單類型,如int、double、bool等都是結(jié)構(gòu)類型。如果需要的話,甚至可以使用結(jié)構(gòu)類型結(jié)合運(yùn)算符運(yùn)算重載,再為 C# 語言創(chuàng)建出一種新的值類型來。
由于結(jié)構(gòu)是值類型,并且直接存儲(chǔ)數(shù)據(jù),因此在一個(gè)對(duì)象的主要成員為數(shù)據(jù)且數(shù)據(jù)量不大的情況下,使用結(jié)構(gòu)會(huì)帶來更好的性能。
因?yàn)榻Y(jié)構(gòu)是值類型,因此在為結(jié)構(gòu)分配內(nèi)存,或者當(dāng)結(jié)構(gòu)超出了作用域被刪除時(shí),性能會(huì)非常好,因?yàn)樗麄儗?nèi)聯(lián)或者保存在堆棧中。當(dāng)把一個(gè)結(jié)構(gòu)類型的變量賦值給另一個(gè)結(jié)構(gòu)時(shí),對(duì)性能的影響取決于結(jié)構(gòu)的大小,如果結(jié)構(gòu)的數(shù)據(jù)成員非常多而且復(fù)雜,就會(huì)造成損失,接下來使用一段代碼來說明這個(gè)問題。
結(jié)構(gòu)和類的適用場(chǎng)合分析:
1、當(dāng)堆棧的空間很有限,且有大量的邏輯對(duì)象時(shí),創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些;
2、對(duì)于點(diǎn)、矩形和顏色這樣的輕量對(duì)象,假如要聲明一個(gè)含有許多個(gè)顏色對(duì)象的數(shù)組,則CLR需要為每個(gè)對(duì)象分配內(nèi)存,在這種情況下,使用結(jié)構(gòu)的成本較低;
3、在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),類是最好的選擇,因?yàn)榻Y(jié)構(gòu)不支持繼承。
4、大多數(shù)情況下,目標(biāo)類型只是含有一些數(shù)據(jù),或者以數(shù)據(jù)為主。
以上就是c# Struct的一些問題分析的詳細(xì)內(nèi)容,更多關(guān)于c# Struct的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#調(diào)用C類型dll入?yún)閟truct的問題詳解
- C#使用struct直接轉(zhuǎn)換下位機(jī)數(shù)據(jù)的示例代碼
- C#中的只讀結(jié)構(gòu)體(readonly struct)詳解
- 區(qū)分C# 中的 Struct 和 Class
- 淺析C# 結(jié)構(gòu)體struct
- C#如何從byte[]中直接讀取Structure實(shí)例詳解
- 深入解析C#編程中struct所定義的結(jié)構(gòu)
- C#中結(jié)構(gòu)(struct)的部分初始化和完全初始化實(shí)例分析
- C#中struct和class的區(qū)別詳解
- C# Struct的內(nèi)存布局問題解答
- 深入探討C#中的結(jié)構(gòu)struct
相關(guān)文章
c# RSA非對(duì)稱加解密及XML&PEM格式互換方案
這篇文章主要介紹了c# RSA非對(duì)稱加解密及XML&PEM格式互換方案,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12C#中Foreach循環(huán)遍歷的本質(zhì)與枚舉器詳解
這篇文章主要給大家介紹了關(guān)于C#中Foreach循環(huán)遍歷本質(zhì)與枚舉器的相關(guān)資料,foreach循環(huán)用于列舉出集合中所有的元素,foreach語句中的表達(dá)式由關(guān)鍵字in隔開的兩個(gè)項(xiàng)組成,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08C#獲取App.Config配置項(xiàng)的方法總結(jié)
在本篇內(nèi)容里小編給大家分享了C#獲取App.Config配置項(xiàng)的方法和相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-03-03C#實(shí)現(xiàn)Log4Net日志分類和自動(dòng)維護(hù)實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)Log4Net日志分類和自動(dòng)維護(hù),實(shí)例講述了Log4Net日志分類和自動(dòng)維護(hù)的實(shí)現(xiàn)方法,并提供了完整的實(shí)例供大家參考學(xué)習(xí),需要的朋友可以參考下2014-10-10C#模擬實(shí)現(xiàn)抽獎(jiǎng)小程序的示例代碼
這篇文章主要介紹了通過C#模擬實(shí)現(xiàn)一個(gè)簡單的抽獎(jiǎng)小程序,文中的示例代碼講解詳細(xì),對(duì)我們了解C#有一定的幫助,需要的可以參考一下2021-12-12基于WPF實(shí)現(xiàn)ListBox拖動(dòng)子項(xiàng)
這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)ListBox拖動(dòng)子項(xiàng)效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-04-04