最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#基礎(chǔ)教程之類class與結(jié)構(gòu)struct的區(qū)別

 更新時(shí)間:2022年11月03日 11:42:36   作者:斯內(nèi)科  
struct是值類型,創(chuàng)建一個(gè)struct類型的實(shí)例被分配在棧上,class是引用類型,創(chuàng)建一個(gè)class類型實(shí)例被分配在托管堆上,下面這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)教程之類class與結(jié)構(gòu)struct區(qū)別的相關(guān)資料,需要的朋友可以參考下

一、類class

類class是引用類型,可以直接賦值為null,默認(rèn)值也是null

XClass xClass = null;//語法正確

一般來說,某個(gè)類對象使用另一個(gè)類的對象賦值時(shí),則兩者共用一個(gè)內(nèi)存地址【節(jié)約內(nèi)存空間】,ReferenceEquals引用比較此時(shí)返回true

            XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
            XClass xClass4 = xClass3;

類的構(gòu)造函數(shù)(構(gòu)造方法)

如果一個(gè)類沒有顯示定義構(gòu)造函數(shù),則默認(rèn)有一個(gè)無參構(gòu)造函數(shù),

如果一個(gè)類已定義了帶參數(shù)的構(gòu)造函數(shù),如果不手動(dòng)定義無參構(gòu)造函數(shù),則沒有無參構(gòu)造函數(shù)

特殊類String:

特殊類【字符串String】雖然是引用類型,但對字符串的更新并不會修改字符串的原實(shí)際值,

字符串作為參數(shù)傳遞并不能篡改原來的值,

可以認(rèn)為字符串雖然是引用類型,但使用時(shí)按值類型處理

二、結(jié)構(gòu)struct

結(jié)構(gòu)struct是值類型,不能直接賦值為null,結(jié)構(gòu)的默認(rèn)值為0,false,類型名稱字符串等

XStruct xStruct=null;//語法錯(cuò)誤,不能為值類型賦值為null

如果想為值類型賦值為null,請使用可空類型Nullable<T>

public struct Nullable<T> where T : struct

比如如下代碼即可編譯通過:

Nullable<XStruct> xStruct = null;//可空值類型

或者簡化為

XStruct? xStruct = null;//可空值類型的簡化

    某個(gè)結(jié)構(gòu)對象使用另一個(gè)結(jié)構(gòu)的對象賦值時(shí),則兩者的內(nèi)存地址完全不同,第二個(gè)結(jié)構(gòu)對象新開一個(gè)內(nèi)存空間,只不過內(nèi)存的值完全一致【內(nèi)存空間增加】,ReferenceEquals引用比較此時(shí)返回false

結(jié)構(gòu)的構(gòu)造函數(shù)

所有結(jié)構(gòu)都自動(dòng)繼承抽象值類型基類ValueType,有個(gè)默認(rèn)無參構(gòu)造函數(shù)ValueType(),因此無法在自定義結(jié)構(gòu)中定義無參構(gòu)造函數(shù)

using System.Runtime.InteropServices;
using System.Security;
 
namespace System
{
    //
    // 摘要:
    //     為值類型提供基類。
    [ComVisible(true)]
    public abstract class ValueType
    {
        //
        // 摘要:
        //     初始化 System.ValueType 類的新實(shí)例。
        protected ValueType();
 
        //
        // 摘要:
        //     指示此實(shí)例與指定對象是否相等。
        //
        // 參數(shù):
        //   obj:
        //     要與當(dāng)前實(shí)例進(jìn)行比較的對象。
        //
        // 返回結(jié)果:
        //     如果 true 和該實(shí)例具有相同的類型并表示相同的值,則為 obj;否則為 false。
        [SecuritySafeCritical]
        public override bool Equals(object obj);
        //
        // 摘要:
        //     返回此實(shí)例的哈希代碼。
        //
        // 返回結(jié)果:
        //     一個(gè) 32 位帶符號整數(shù),它是此實(shí)例的哈希代碼。
        [SecuritySafeCritical]
        public override int GetHashCode();
        //
        // 摘要:
        //     返回此實(shí)例的完全限定類型名稱。
        //
        // 返回結(jié)果:
        //     完全限定的類型名稱
        public override string ToString();
    }
}

值類型重寫了Equals方法,如果一個(gè)值類型的具體屬性值完全一致時(shí),兩個(gè)對象是相等的

三、測試控制臺應(yīng)用程序GenericTemplateDemo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace GenericTemplateDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetWindowSize(120, 30);
            Console.WriteLine($"結(jié)構(gòu)的默認(rèn)值為類型名(一定不為null):{default(XStruct)},類型名為【{typeof(XStruct)}】");
            Console.WriteLine($"類的默認(rèn)值為null?【{default(XClass) == null}】");
            Console.WriteLine("---------------------------------結(jié)構(gòu)的Equal比較---------------------------------");
            XStruct xStruct1 = new XStruct() { Id = 5, Name = "ABC" };
            XStruct xStruct2 = new XStruct("ABC") { Id = 5 };
            Console.WriteLine($"結(jié)構(gòu)一的內(nèi)容{{Id:{xStruct1.Id},Name:{xStruct1.Name}}}");
            Console.WriteLine($"結(jié)構(gòu)二的內(nèi)容{{Id:{xStruct2.Id},Name:{xStruct2.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比較兩個(gè)結(jié)構(gòu)的實(shí)例值是否相等:{xStruct1.Equals(xStruct2)}");
            Console.WriteLine($"比較兩個(gè)結(jié)構(gòu)的引用是否指向同一個(gè)實(shí)例:{ReferenceEquals(xStruct1, xStruct2)}");
 
            XStruct xStruct3 = new XStruct("修吾") { Id = 8 };
            XStruct xStruct4 = xStruct3;
            Console.WriteLine($"結(jié)構(gòu)三的內(nèi)容{{Id:{xStruct3.Id},Name:{xStruct3.Name}}}");
            Console.WriteLine($"結(jié)構(gòu)四的內(nèi)容{{Id:{xStruct4.Id},Name:{xStruct4.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比較兩個(gè)結(jié)構(gòu)的實(shí)例值是否相等:{xStruct3.Equals(xStruct4)}");
            Console.WriteLine($"比較兩個(gè)結(jié)構(gòu)的引用是否指向同一個(gè)實(shí)例:{ReferenceEquals(xStruct3, xStruct4)}");
            Console.WriteLine("---------------------------------類的Equal比較---------------------------------");
            XClass xClass1 = new XClass() { Id = 6, Name = "毒瘴泉" };
            XClass xClass2 = new XClass("毒瘴泉") { Id = 6 };
            Console.WriteLine($"類一的內(nèi)容{{Id:{xClass1.Id},Name:{xClass1.Name}}}");
            Console.WriteLine($"類二的內(nèi)容{{Id:{xClass2.Id},Name:{xClass2.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比較兩個(gè)類的實(shí)例值是否相等:{xClass1.Equals(xClass2)}");
            Console.WriteLine($"比較兩個(gè)類的引用是否指向同一個(gè)實(shí)例:{ReferenceEquals(xClass1, xClass2)}");
            Console.WriteLine();
            XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
            XClass xClass4 = xClass3;
            Console.WriteLine($"類三的內(nèi)容{{Id:{xClass3.Id},Name:{xClass3.Name}}}");
            Console.WriteLine($"類四的內(nèi)容{{Id:{xClass4.Id},Name:{xClass4.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比較兩個(gè)類的實(shí)例值是否相等:{xClass3.Equals(xClass4)}");
            Console.WriteLine($"比較兩個(gè)類的引用是否指向同一個(gè)實(shí)例:{ReferenceEquals(xClass3, xClass4)}");
            Console.ReadLine();
        }        
    }
 
    /// <summary>
    /// 測試用的結(jié)構(gòu),結(jié)構(gòu)繼承ValueType,而ValueType重寫了Equals(object obj)方法,因此比較
    /// 結(jié)構(gòu)不允許顯式定義無參的構(gòu)造函數(shù),因 結(jié)構(gòu)struct一經(jīng)定義,自動(dòng)會生成一個(gè)無參構(gòu)造函數(shù)
    /// </summary>
    struct XStruct
    {
        public XStruct(string name)
        {
            Id = 0;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }
 
    /// <summary>
    /// 測試用的類
    /// </summary>
    class XClass
    {
        public XClass()
        {
        }
        public XClass(string name)
        {
            Id = 0;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

四、程序運(yùn)行如圖:

補(bǔ)充:結(jié)構(gòu)與類的區(qū)別

1.類和結(jié)構(gòu)有以下幾個(gè)基本的不同點(diǎn):

  • 類是引用類型,結(jié)構(gòu)是值類型。
  • 結(jié)構(gòu)不支持繼承。
  • 結(jié)構(gòu)不能聲明默認(rèn)的構(gòu)造函數(shù)。
  • 結(jié)構(gòu)體中聲明的字段無法賦予初值,類可以
  • 類的對象是存儲在堆空間中,結(jié)構(gòu)存儲在棧中。

2.選擇使用情況

堆空間大,但訪問速度較慢,棧空間小,訪問速度相對更快。當(dāng)我們描述一個(gè)輕量級對象的時(shí)候,結(jié)構(gòu)可提高效率,成本更低。不過假如我們在傳值的時(shí)候希望傳遞的是對象的引用地址而不是對象的拷貝,就應(yīng)該使用類了。

總結(jié)

到此這篇關(guān)于C#基礎(chǔ)教程之類class與結(jié)構(gòu)struct區(qū)別的文章就介紹到這了,更多相關(guān)C# 類class與結(jié)構(gòu)struct區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)一鍵批量合并PDF文檔

    C#實(shí)現(xiàn)一鍵批量合并PDF文檔

    這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)一鍵批量合并PDF文檔功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-09-09
  • C#中Invoke的具體使用

    C#中Invoke的具體使用

    本文主要介紹了C#中Invoke的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Winform基于多線程實(shí)現(xiàn)每隔1分鐘執(zhí)行一段代碼

    Winform基于多線程實(shí)現(xiàn)每隔1分鐘執(zhí)行一段代碼

    這篇文章主要介紹了Winform基于多線程實(shí)現(xiàn)每隔1分鐘執(zhí)行一段代碼的方法,設(shè)計(jì)線程的操作及時(shí)間函數(shù)的用法,需要的朋友可以參考下
    2014-10-10
  • C#將Excel轉(zhuǎn)成PDF的方法

    C#將Excel轉(zhuǎn)成PDF的方法

    今天小編就為大家分享一篇關(guān)于C#將Excel轉(zhuǎn)成PDF的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C# 設(shè)計(jì)模式系列教程-組合模式

    C# 設(shè)計(jì)模式系列教程-組合模式

    組合模式可以使客戶端調(diào)用簡單,它可以一致使用組合結(jié)構(gòu)或是其中單個(gè)對象,簡化了客戶端代碼。
    2016-06-06
  • WPF實(shí)現(xiàn)3D立方體波浪墻效果

    WPF實(shí)現(xiàn)3D立方體波浪墻效果

    這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)3D立方體波浪墻效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 利用C#實(shí)現(xiàn)修改圖片透明度功能

    利用C#實(shí)現(xiàn)修改圖片透明度功能

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)修改圖片透明度功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • C# 操作Excel代碼總結(jié)

    C# 操作Excel代碼總結(jié)

    這篇文章主要介紹了C# 操作Excel代碼總結(jié),具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • C#中txt數(shù)據(jù)寫入的幾種常見方法

    C#中txt數(shù)據(jù)寫入的幾種常見方法

    這篇文章主要給大家介紹了關(guān)于C#中txt數(shù)據(jù)寫入的幾種常見方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C#實(shí)現(xiàn)ComboBox變色的示例代碼

    C#實(shí)現(xiàn)ComboBox變色的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)ComboBox變色的效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01

最新評論

甘肃省| 布拖县| 罗甸县| 祁门县| 西充县| 民权县| 右玉县| 日土县| 康定县| 东兴市| 海淀区| 巩留县| 新干县| 延川县| 德兴市| 崇文区| 孟津县| 丹寨县| 建平县| 宁阳县| 高邑县| 松原市| 木兰县| 西乌珠穆沁旗| 邻水| 革吉县| 河池市| 洪雅县| 枝江市| 兰西县| 辽阳县| 陕西省| 商丘市| 四子王旗| 酉阳| 科技| 酒泉市| 右玉县| 双牌县| 左权县| 南宁市|