Re: [問題] 請問 Object 與 object 的不同 ?
※ 引述《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)
推
02/06 05:36, , 1F
02/06 05:36, 1F
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章