日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#中struct與class的區別詳解_C#教程

作者:qq_42987967 ? 更新時間: 2022-08-07 編程語言

1.最大的區別

struct類型定義的變量是值類型,class定義的變量是引用類型。因此struct類型定義的對象是分配在棧上面的,而class定義的對象是分配在堆上的。

2.struct成員無法被聲明為protected。

舉例:

struct Test1
{
    protected readonly bool c;//會報錯
}

3.struct是隱式的sealed類

因此struct不能被繼承也無法繼承其他,因此其成員也不能指定為 abstract、virtual (畢竟被密封了,無法實現虛函數跟抽象函數)。

但是struct可以實現接口。

interface i1
{
    void fun();
}
struct Test1:i1
{
    public void fun()
    {
        throw new System.NotImplementedException();
    }
}

4.struct中無法重載默認構造函數

struct Test1
{
    public int a ;
    public Test1(int A) //但是可定義非默認構造函數
    { 
        a = A; 
    }
    public Test1()//對默認構造函數重載,將報錯
    {
        a = 1;
    }
}

5.關于對象的初始化

1)結構體中的變量是不能在結構體中直接賦初始值的,類的變量成員可以。

struct Test1
{
    public int a =1;//不允許賦初值,因此是錯的
    public int b;//對的
 
}
class Test2
{
    public int a=1;//對的
    public int b;//對的,默認賦初值為0 
}

2)當使用 New 操作符創建一個結構對象時,會調用適當的構造函數來創建結構。與類不同,結構可以不使用 New 操作符即可被實例化。(即不使用new也是真的開辟了一個存儲該struct變量的空間)

3)但是如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被賦值,對象才被使用。如果使用默認構造函數進行new,會對數據進行默認賦值(int為0,引用類型為Null)

struct Test1
{
    public int a =1;
    public string b =1;
}
    void TestFun()
    {
        Test1 test1;
        test1.a = 1,test1.b = "1234";//必須給a跟b都賦值了才能使用test1
        Console.WriteLine(test1.a);
        Test1 test2=new Test1();//test2.a=0,test2.b=Null
    }

4)struct中的構造函數必須為所有數據成員賦初值。

struct Test1
{
    public int a ;//不允許賦初值,因此是錯的
    public string b;
    public Test1(int A) { 
        a = A;
        b = "4534";//必須對所有數據成員賦初值,否則報錯
    }
}

6.結構體沒有析構函數,也無法自己去給結構體定義一個析構函數

畢竟struct是值類型,用析構函數也沒啥鳥用。

struct Test1
{
    ~Test1() { }//錯誤的做法,會報錯
}

原文鏈接:https://blog.csdn.net/qq_42987967/article/details/125259813

欄目分類
最近更新