C#中struct與class的區(qū)別詳解
1.最大的區(qū)別
struct類型定義的變量是值類型,class定義的變量是引用類型。因此struct類型定義的對象是分配在棧上面的,而class定義的對象是分配在堆上的。
2.struct成員無法被聲明為protected。
舉例:
struct Test1
{
protected readonly bool c;//會報錯
}
3.struct是隱式的sealed類
因此struct不能被繼承也無法繼承其他,因此其成員也不能指定為 abstract、virtual (畢竟被密封了,無法實現(xiàn)虛函數(shù)跟抽象函數(shù))。
但是struct可以實現(xiàn)接口。
interface i1
{
void fun();
}
struct Test1:i1
{
public void fun()
{
throw new System.NotImplementedException();
}
}
4.struct中無法重載默認構(gòu)造函數(shù)
struct Test1
{
public int a ;
public Test1(int A) //但是可定義非默認構(gòu)造函數(shù)
{
a = A;
}
public Test1()//對默認構(gòu)造函數(shù)重載,將報錯
{
a = 1;
}
}
5.關(guān)于對象的初始化
1)結(jié)構(gòu)體中的變量是不能在結(jié)構(gòu)體中直接賦初始值的,類的變量成員可以。
struct Test1
{
public int a =1;//不允許賦初值,因此是錯的
public int b;//對的
}
class Test2
{
public int a=1;//對的
public int b;//對的,默認賦初值為0
}
2)當(dāng)使用 New 操作符創(chuàng)建一個結(jié)構(gòu)對象時,會調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù)來創(chuàng)建結(jié)構(gòu)。與類不同,結(jié)構(gòu)可以不使用 New 操作符即可被實例化。(即不使用new也是真的開辟了一個存儲該struct變量的空間)
3)但是如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被賦值,對象才被使用。如果使用默認構(gòu)造函數(shù)進行new,會對數(shù)據(jù)進行默認賦值(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中的構(gòu)造函數(shù)必須為所有數(shù)據(jù)成員賦初值。
struct Test1
{
public int a ;//不允許賦初值,因此是錯的
public string b;
public Test1(int A) {
a = A;
b = "4534";//必須對所有數(shù)據(jù)成員賦初值,否則報錯
}
}
6.結(jié)構(gòu)體沒有析構(gòu)函數(shù),也無法自己去給結(jié)構(gòu)體定義一個析構(gòu)函數(shù)
畢竟struct是值類型,用析構(gòu)函數(shù)也沒啥鳥用。
struct Test1
{
~Test1() { }//錯誤的做法,會報錯
}
到此這篇關(guān)于C#中struct與class的區(qū)別詳解的文章就介紹到這了,更多相關(guān)C# struct與class內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中獲取二維數(shù)組的行數(shù)和列數(shù)以及多維數(shù)組各個維度的長度
這篇文章介紹了C#中獲取二維數(shù)組的行數(shù)和列數(shù)以及多維數(shù)組各個維度的長度,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
c# DateTime常用操作實例(datetime計算時間差)
字符串操作DateTime操作,datetime計算時間差,取當(dāng)前時間,更多方法看下面代碼2013-12-12
C#?彈出窗口show()和showdialog()的兩種方式
本文主要介紹了C#?彈出窗口show()和showdialog()的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
C#如何將List<string>轉(zhuǎn)換為List<double>
這篇文章主要介紹了C#如何將List<string>轉(zhuǎn)換為List<double>問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

