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

