3 回答

TA貢獻1820條經(jīng)驗 獲得超2個贊
第一個問題:,“結(jié)構(gòu)體”和“類”有啥區(qū)別?怎樣辨別是結(jié)構(gòu)體還是類!
結(jié)構(gòu)體是一種值類型,而類是引用類型。(值類型、引用類型是根據(jù)數(shù)據(jù)存儲的角度來分的)
就是值類型用于存儲數(shù)據(jù)的值,引用類型用于存儲對實際數(shù)據(jù)的引用。那么結(jié)構(gòu)體就是當成值來使用的,類則通過引用來對實際數(shù)據(jù)操作。
第二個問題:兩者里面是不是都有構(gòu)造函數(shù)?為什么結(jié)構(gòu)體用得比較少?
構(gòu)造函數(shù)是為了初始化類的字段而存在的,而結(jié)構(gòu)體并不需要初始化就能使用,因此,結(jié)構(gòu)體中并不存在構(gòu)造函數(shù)。
不能以使用多少來衡量,只是看相應(yīng)問題使用最適合的方法罷了。結(jié)構(gòu)體的定義是:有些數(shù)據(jù)既是相互關(guān)聯(lián)的,又共同描述一個完整事物,如:一個學生的整體信息,學號、姓名、性別等。而類則使用在需要比較有層次的數(shù)據(jù)上面。

TA貢獻1834條經(jīng)驗 獲得超8個贊
1,結(jié)構(gòu)是實值類型(Value Types),而類則是引用類型(Reference Types)。
2,結(jié)構(gòu)使用棧存儲(Stack Allocation),而類使用堆存儲(Heap Allocation)。
3,所有結(jié)構(gòu)成員默認都是Public,而類的變量和常量數(shù)則默認位Private,不過其他類成員默認都是Public。
4,結(jié)構(gòu)成員不能被聲明位Protected,而類成員可以。
5,結(jié)構(gòu)變量聲明不能指定初始值、使用New關(guān)鍵字貨對數(shù)組進行初始化,但是類變量聲明可以。
6,結(jié)構(gòu)不能聲明默認的構(gòu)造函數(shù),也就是不擁有參數(shù)的非共享構(gòu)造函數(shù),但是類則無此限制。
7,二者都可以擁有共享構(gòu)造函數(shù),結(jié)構(gòu)的共享構(gòu)造函數(shù)不能帶有參數(shù),但是類的共享構(gòu)造函數(shù)則可以帶或者不帶參數(shù)。
8,結(jié)構(gòu)不允許聲明析構(gòu)函數(shù)(Destructor),類則無此限制。
9,結(jié)構(gòu)的實例(Instance)聲明,不允許對包含的變量進行初始化設(shè)定,類則可以在聲明類的實例時,同時進行變量初始化。
10,結(jié)構(gòu)是隱式繼承自ValueType類,而且不能繼承任何其他類型,類則可以繼續(xù)自ValueType以外的任何類。
11,結(jié)構(gòu)是無法被繼承的,類則可以。
12,結(jié)構(gòu)永遠不會終止,因此CLR不會在任何結(jié)構(gòu)上調(diào)用Finalize方法。類則是由內(nèi)存回收進程加以終止,當內(nèi)存回收進程檢測到?jīng)]有任何作用的類時,它就會調(diào)用類的Finalize方法。
13,結(jié)構(gòu)不需要構(gòu)造函數(shù),類則需要構(gòu)造函數(shù)。
14,結(jié)構(gòu)只能在一種情況下使用非共享構(gòu)造函數(shù),那就是非共享構(gòu)造函數(shù)會接受參數(shù)。但是類則無此限制,它可以使用帶參數(shù)或不帶參數(shù)的非共享構(gòu)造函數(shù)。
14,每一個結(jié)構(gòu)都具有無參數(shù)的隱含公共構(gòu)造函數(shù),此構(gòu)造函數(shù)會將結(jié)構(gòu)的所有成員初始化為其默認值。不需要重新定義這個行為。
在“實例和變量”層面上,由于結(jié)構(gòu)是數(shù)值類型的,因此每一個結(jié)構(gòu)變量會永遠的綁定到結(jié)構(gòu)實例上。然而類是引用類型的,而且對象變量可引用不同的類實例,在此方面的區(qū)別,會對使用將結(jié)構(gòu)和類造成如下的影響:
15,結(jié)構(gòu)變量會隱式的使用結(jié)構(gòu)的無參數(shù)構(gòu)造函數(shù)來初始化成員,這就意味語句 Struct S = new Struct()。
16,當您將一個結(jié)構(gòu)變量賦值給另一個,或者將結(jié)構(gòu)實例傳遞到程序變量時,所有變量成員的值會復(fù)制到新的結(jié)構(gòu)中。當您將一個對象變量賦值給另一個,或者將對象變量傳遞給程序時,則只是復(fù)制指針。
17,您可以將Null值賦值給結(jié)構(gòu)變量,但是該實例會一直與該變量保持關(guān)聯(lián)。雖然變量成員會因此賦值而重新初始化,但是您還是可以調(diào)用變量的方法并訪問其數(shù)據(jù)成員。相反的,如果您將對象變量設(shè)定為Null,您就會中斷它與任何類型實例的關(guān)聯(lián),而且除非您再將另一個實例賦值給它,否則無法通過變量訪問任何成員。
18,您可以在不同時間將不同的類的實例賦值給同一個對象變量,而且在同一時間可有好幾個對象變量引用相同的類實例,如果您對類成員值做了改變,則其他指向相同實例的對象變量也會發(fā)生改變。然而,結(jié)構(gòu)成員則會封裝在他們自己的實例中,變更結(jié)構(gòu)成員值并不會對其他任何結(jié)構(gòu)變量的成員造成影響,甚至也不會影響相同結(jié)構(gòu)聲明的其他實例。
19,兩個結(jié)構(gòu)必須以成員對成員的比較方式來執(zhí)行相等比較。兩個對象變量可以使用Equals方法來加以比較。Equals會判斷兩個變量是否指向相同的實例。
- 3 回答
- 0 關(guān)注
- 548 瀏覽
添加回答
舉報