Re: [問題] 基本問題 關於static

看板C_Sharp (C#)作者 (遙遠的旅人)時間19年前 (2006/07/16 11:23), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
※ 引述《ji3g45j (pig)》之銘言: : ※ 引述《zanyking (遙遠的旅人)》之銘言: : : 都已經是Const了為啥還需要static?? : : 所謂的Const,就是用來修飾一些"常數"用的。 : : 既然是常數,就表示在整個執行期都不會有改變。 : Const是一個常數,編譯器能夠把它放在程式記憶體而不會佔到資料記憶體 : static是宣告一個變數,他是存於資料記憶體的,而且不會被釋放掉 先不去考慮MSIL或VM背後如何實作這個問題,單單只就語言邏輯層面去思考。 const關鍵字是用來表示一個變數是常數,一個常數代表著: 1.它在一個執行體(classLoader、AppDomain what else)當中為唯一的。 2.它的reference必須不可改變。 3.它的內容也不可改變。 Def-1 標示了與static一樣的性質。 def-2 標示了readonly、final(JAVA)的特性。 def-3 雖然看上去知道是什麼意思,背後卻隱藏了不少東西。 先從Def-2看起。 所謂的readonly指的並不是內容為readonly,而是reference為readonly, 也就是這個reference所指向的記憶體位址(邏輯上的)是不改變的,但他並 沒有保證這個位址所代表的物件其內容亦為不可變! 也就是說,你可以有一個static readonly的ArrayList,你可以任意Add or Remove你想要的東西,但你就是不能把reference指到其他地方。 而const,就是要保證Def-3這點。(如果你不作unsafe operation的話。) 所以,const可不可以用來形容動態資料結構呢?不行。 因為,『動態』與『常量』的語言觀念是互斥的。 事實上,就語意來說連fixed size陣列都是不容許的。 (實際可不可以沒測過,應該也是不行。) 所以,你會發現const只會用來描述string & 基本型態,(enum沒試過,語 意上應該可以。)而不會用來描述List、Dic、Set。 所以,下次有人問起『為何const不能形容陣列?』,可以這麼回答: 如果你需要一個不可變的陣列存放不可變的內容,那何不將它們一一列舉出 來宣告在class中,再利用static C# Indexer去作Array Like的存取呢? 物件可以像陣列,類別也可以。 -- JAVA 是一個靜態型別reference指定、強物件型別判定的語言。 屬於類C/C++族。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.85.116.116
文章代碼(AID): #14kR4cSW (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #14kR4cSW (C_Sharp)