作者GreatShot (我要拿Ph.D.!!!)
看板C_Sharp
标题Re: [问题] 请问 Object 与 object 的不同 ?
时间Tue Feb 6 03:36:42 2007
※ 引述《Epimenides (No.6)》之铭言:
: ※ 引述《GreatShot (我要拿Ph.D.!!!)》之铭言:
: : 只是个alias而已
: : 不用想得太复杂
: : ^^;
: : String and string也只是alias
: 之前念到这的时候也有一点疑问...
: 如果这样的话 int, double, string 这些
: 全部都是 reference type 罗?
: 也就是说 C#里 没有 primitive type 这种东西?
我的观念如下
您参考看看
总之C# "万物皆为物件" 这个观念不会错
================================
//关於datatype
全部都是alias
绝大部分的小写关键字也都是alias(sbyte..double..float..)
你可以作实验随便宣告几个变数, 然後用GetType()这个方法或是typeof 一一去看
int 物件他会告诉你这是System.Int32, float是System.Single
依此类推
这些都属於 C# Predefined Type
//关於primitive type or reference type
像是int double等等, 这一类的物件是继承自System.ValueType
这是一个为了程式效率而特化过的class
ValueType这个class的特点, 就是所有继承自他的物件,
工作的方式就是直接传值的primitive type
而其记忆体配置是stack allocation
你可以这样做实验
int a = 0 ; Console.WriteLine(a.GetType().IsPrimitive.ToString());
得到的答案会是"True"
反之你也可以用
int a = 0 ; Console.WriteLine(a.GetType().IsMarShalByRef.ToString());
得到的答案会是"False"
所以这种datatype看起来很怪
因为他不但不需要使用new 关键字来初始化, 不太像个class
却又可以用一般reference type才有的语法
eg. int a = 0 ; Console.WriteLine(a.ToString());
但是行为却又像C里头的int一样..
连杰克都没有这麽神奇
其实是因为在C#中
这类型继承自ValueType的Predefined物件给定初值後, 等效於将物件初始化
int a = 0 ; 跟 Int32 a = new Int32(); 是一模一样的意思
(Constructor 会预设值为 0)
所以才会这麽容易混淆
(所以当你宣告一个int a; 却没有给初值就去使用的时候, compiler会给error,
就是因为这个class还没被初始化, 不像某些语言直接就预设为0了)
若是要让继承自ValueType的这些物件变成heap allocation的变数的时候呢
就要去作boxing/unboxing的动作, 使之成为大家习惯的reference type
至於怎麽作就不多说了, 我想大家应该都很熟
以上希望有帮助 有错也请顺便指正
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.110.47
※ 编辑: GreatShot 来自: 220.133.110.47 (02/06 04:34)
1F:推 Epimenides:强者! 解除了我长久以来的疑惑 大感谢 02/06 05:36