作者zanyking (遥远的旅人)
看板C_Sharp
标题Re: [问题] 基本问题 关於static
时间Sun Jul 16 12:11:49 2006
※ 引述《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