c# Struct的一些問(wèn)題分析
Struct的理論看過(guò)好一些,可是工作上基本沒(méi)有應(yīng)用過(guò),Class倒處處都有。難道Struct就沒(méi)有什么使用價(jià)值嗎?搜了一下如何在類(lèi)和結(jié)構(gòu)中做出選擇?
✔️ 如果類(lèi)型的實(shí)例很小且通常壽命很短或通常嵌入其他對(duì)象中,請(qǐng)考慮定義結(jié)構(gòu)而不是類(lèi)。
❌ 避免定義結(jié)構(gòu),除非該類(lèi)型具有以下所有特征:
它在邏輯上表示單個(gè)值,類(lèi)似于原始類(lèi)型(int,double等)。
它的實(shí)例大小低于 16 字節(jié)。
它是不可變的。
它不必經(jīng)常裝箱。
在開(kāi)發(fā)軟件時(shí),常常會(huì)有頁(yè)面彈窗,而主頁(yè)面經(jīng)常需要傳一些參數(shù)到窗體里面,窗體也只是用這些參數(shù)來(lái)搜出其他數(shù)據(jù)展示,或進(jìn)行數(shù)據(jù)保存時(shí)使用,也就是只讀那些入?yún)?。雖然通過(guò)構(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> /// 簡(jiǎn)稱(chēng) /// </summary> internal readonly string ShortName; /// <summary> /// 全稱(chēng) /// </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)); } } }
與類(lèi)的區(qū)別:
C# 中結(jié)構(gòu)類(lèi)型和類(lèi)類(lèi)型在語(yǔ)法上非常相似,他們都是一種數(shù)據(jù)結(jié)構(gòu),都可以包括數(shù)據(jù)成員和方法成員。
結(jié)構(gòu)和類(lèi)的區(qū)別:
1、結(jié)構(gòu)是值類(lèi)型,它在棧中分配空間;而類(lèi)是引用類(lèi)型,它在堆中分配空間,棧中保存的只是引用。
2、結(jié)構(gòu)類(lèi)型直接存儲(chǔ)成員數(shù)據(jù),讓其他類(lèi)的數(shù)據(jù)位于堆中,位于棧中的變量保存的是指向堆中數(shù)據(jù)對(duì)象的引用。
C# 中的簡(jiǎn)單類(lèi)型,如int、double、bool等都是結(jié)構(gòu)類(lèi)型。如果需要的話(huà),甚至可以使用結(jié)構(gòu)類(lèi)型結(jié)合運(yùn)算符運(yùn)算重載,再為 C# 語(yǔ)言創(chuàng)建出一種新的值類(lèi)型來(lái)。
由于結(jié)構(gòu)是值類(lèi)型,并且直接存儲(chǔ)數(shù)據(jù),因此在一個(gè)對(duì)象的主要成員為數(shù)據(jù)且數(shù)據(jù)量不大的情況下,使用結(jié)構(gòu)會(huì)帶來(lái)更好的性能。
因?yàn)榻Y(jié)構(gòu)是值類(lèi)型,因此在為結(jié)構(gòu)分配內(nèi)存,或者當(dāng)結(jié)構(gòu)超出了作用域被刪除時(shí),性能會(huì)非常好,因?yàn)樗麄儗?nèi)聯(lián)或者保存在堆棧中。當(dāng)把一個(gè)結(jié)構(gòu)類(lèi)型的變量賦值給另一個(gè)結(jié)構(gòu)時(shí),對(duì)性能的影響取決于結(jié)構(gòu)的大小,如果結(jié)構(gòu)的數(shù)據(jù)成員非常多而且復(fù)雜,就會(huì)造成損失,接下來(lái)使用一段代碼來(lái)說(shuō)明這個(gè)問(wèn)題。
結(jié)構(gòu)和類(lèi)的適用場(chǎng)合分析:
1、當(dāng)堆棧的空間很有限,且有大量的邏輯對(duì)象時(shí),創(chuàng)建類(lèi)要比創(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í),類(lèi)是最好的選擇,因?yàn)榻Y(jié)構(gòu)不支持繼承。
4、大多數(shù)情況下,目標(biāo)類(lèi)型只是含有一些數(shù)據(jù),或者以數(shù)據(jù)為主。
以上就是c# Struct的一些問(wèn)題分析的詳細(xì)內(nèi)容,更多關(guān)于c# Struct的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#調(diào)用C類(lèi)型dll入?yún)閟truct的問(wèn)題詳解
- 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)存布局問(wèn)題解答
- 深入探討C#中的結(jié)構(gòu)struct
相關(guān)文章
c# RSA非對(duì)稱(chēng)加解密及XML&PEM格式互換方案
這篇文章主要介紹了c# RSA非對(duì)稱(chēng)加解密及XML&PEM格式互換方案,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12C#中Foreach循環(huán)遍歷的本質(zhì)與枚舉器詳解
這篇文章主要給大家介紹了關(guān)于C#中Foreach循環(huán)遍歷本質(zhì)與枚舉器的相關(guān)資料,foreach循環(huán)用于列舉出集合中所有的元素,foreach語(yǔ)句中的表達(dá)式由關(guān)鍵字in隔開(kāi)的兩個(gè)項(xiàng)組成,本文通過(guò)示例代碼介紹的非常詳細(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日志分類(lèi)和自動(dòng)維護(hù)實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)Log4Net日志分類(lèi)和自動(dòng)維護(hù),實(shí)例講述了Log4Net日志分類(lèi)和自動(dòng)維護(hù)的實(shí)現(xiàn)方法,并提供了完整的實(shí)例供大家參考學(xué)習(xí),需要的朋友可以參考下2014-10-10C#模擬實(shí)現(xiàn)抽獎(jiǎng)小程序的示例代碼
這篇文章主要介紹了通過(guò)C#模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單的抽獎(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-04C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)
C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)...2007-04-04