欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# Struct的一些問題分析

 更新時(shí)間:2021年06月21日 17:02:43   作者:舒碧  
在 C# 中,結(jié)構(gòu)體是值類型數(shù)據(jù)結(jié)構(gòu)。它使得一個(gè)單一變量可以存儲(chǔ)各種數(shù)據(jù)類型的相關(guān)數(shù)據(jù)。struct 關(guān)鍵字用于創(chuàng)建結(jié)構(gòu)體。結(jié)構(gòu)體是用來代表一個(gè)記錄。

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)文章!

相關(guān)文章

最新評(píng)論