Re: [問題] 基本問題 關於static
※ 引述《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
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章