色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

和Java對于結構體的保留有何區別

江奕云2年前14瀏覽0評論

和Java對于結構體的保留有何區別?

本人做過幾年C#,對Java也略有了解,根據自己的理解回答一下這個問題。

首先,Java和C#的設計原則是有所不同的。Java是一門學院派語言,奉行的設計原則是完美的面向對象模型。任何和這個完美模型相違背的東西,都會被Java社區排斥,從而很難進入Java語法。C#雖然語法上和Java很相似,但是卻包含了很多為了實用而做出的折衷/改善。

一個典型的例子是C#中的委托(delegate),其實是不符合面向對象的封裝原則。Java中沒有委托結構,在處理類似的事件多播時,就產生了大量的監聽(listener)接口。語法上來講,委托非常簡潔,而監聽接口則顯得很冗余。但是因為Java社區對語言純潔性的偏執,始終沒有做出妥協。

結構體(struct)也是類似的情況。

結構體最先來源于C語言。C++雖然引入了類(class),但是仍然保留了結構體的原本語義,并做了適當增強,從而實現對C的絕對兼容。這個方案對于C++而言,不難理解,畢竟C++并不是一門純粹面向對象的語言,同時嚴重依賴于C接口。C++中的類和結構體,除了默認訪問級別不同,沒有任何其它區別,都是既可分配在棧上,也可以分配在堆上。

Java語言的基礎語法借鑒自C++,但是只保留了真正面向對象的部分。得益于自動垃圾回收機制的應用,程序員不再需要手工管理堆上的對象,故而棧所扮演的自動內存管理的角色也變得可有可無。結構體作為C語言的遺物,也就被徹底拋棄了。Java只支持將最基本的內置值類型分配到棧上。

C#語言最初在語法層面確實大量借鑒了Java語法(有人還記得當年的J++和J#嗎?),但是又做了大量實用性的改造,結構體正是其中之一:

首先,即使應用了垃圾回收機制,堆上對象的使用成本依然是比較高的,分配速度慢,回收開銷大。C#通過重新定義結構體的語義,允許開發者自定義值類型的結構體,納入棧內存管理,滿足開發者對特殊語義的需要(比如虛數,就很適合設計為值類型),在合理使用的前提下也可以提高性能。

另外一方面,通過對結構體應用顯式布局模式(explicit layout),使得結構體可以按照與C完全相同的模式來布局,甚至支持聯合體(union),從而在調用C接口的API時可以直接傳入傳出,降低了平臺調用(PInvoke)時封送操作的復雜性。

在C#語言的后續發展中,早已和Java分道揚鑣,出現了大量創新性的語言功能。

由此可以看出,是否存在結構體,并不影響Java語言的功能完整性,只是犧牲一些性能優化的潛力,或者增加了某些操作的復雜性(總歸是有替代方案來解決的)。而C#中結構體如果濫用,也可能導致語義的混亂和性能的損失。

以上是我個人的一些粗淺理解,覺得有道理請點贊。覺得有疏漏謬誤,望在評論區指點。

java中的保留字,和Java對于結構體的保留有何區別