← 回筆記列表
後端

物件Object

雖然在js跟cshsarp都叫 object,而且在各自的語言裡都隱約有「代表全部」的身影,但在底層的物理結構與生存哲學上,兩者有著天翻地覆的差別。

  • C#
  • OOP

雖然在js跟cshsarp都叫 object,而且在各自的語言裡都隱約有「代表全部」的身影,但在底層的物理結構與生存哲學上,兩者有著天翻地覆的差別。

簡介

1. JavaScript 的 object ——「沒有地基、隨時能變形的百寶袋」

在 JavaScript 裡,object 幾乎代表了全部 (除了基本型別以外,連 Array、Function 底層都是 object)。

  • 物理真相:JS 的物件在底層(V8引擎)本質上是一個動態的雜湊表(Hash Table / Map)。它是一個空的百寶袋。
  • 生存哲學:它沒有固定的藍圖(Class)。你隨時可以用 obj.age = 25 憑空塞一個新欄位進去。它代表「全部」,是因為它像黏土一樣,你捏成什麼,它就是什麼。

2. C# 的 object ——「鐵打的萬物之源、最模糊的最高祖先」

在 C# 的世界裡,object(也就是系統底層的 System.Object)的代表全部,完全是另一種物理邏輯。C# 是強型別語言,講究的是「長幼尊卑的嚴格繼承樹」。

  • 在 C# 中,object 代表全部的意思是:「它是全天下所有型別共同的、最頂層的唯一祖先(至高無上的父類別)。」
  • 你在 C# 裡寫的任何自訂類別,就算你什麼都不寫,C# 在編譯時都會強迫繼承 object:
// 你以為你只是寫了一個簡單的類別:
public class Mammal { }

// 但在電腦眼裡,物理上它其實長這樣(自動繼承):
public class Mammal : System.Object { }

object boxedMammal = new Mammal() 為什麼可以合理存在? 因為海獅骨子裡一定也是個 object。

  • 4 個最基本的功能 * ToString() * Equals(object obj) * GetType() * GetHashCode()
【boxedMammal 的操作介面】
 ┌────────────────────────┐
 ├─ Equals()              │ ───> 點得出來(老祖宗給的)
 ├─ GetHashCode()         │ ───> 點得出來(老祖宗給的)
 ├─ GetType()             │ ───> 點得出來(老祖宗給的)
 ├─ ToString()            │ ───> 點得出來(老祖宗給的)
 └────────────────────────┘
 ❌ .Name ───> 「查無此功能!」因為老祖宗根本不知道什麼是 Name。

3. C# 的 object 裝進去之後會「集體失憶」

在 JavaScript 裡,你把物件宣告成什麼都無所謂,你隨時能點出裡面的屬性。 但在 C# 裡,當你把海獅(Mammal)的地址塞進一個 object 變數時,你手裡的放大鏡規格就被降格到了最模糊的 object 級別:

object boxedMammal = new Mammal { Name = "Sea lion" };

// ❌ 在 C# 裡這行絕對連編譯都不會過!
Console.WriteLine(boxedMammal.Name);

4. 兩者在記憶體與觀念上的終極對照


【JavaScript 的 object (動態黏土)】
變數 obj ───> [ 記憶體百寶袋 ] ───> 隨時可以 .name = "A", .age = 10,完全自由。


【C# 的 object (嚴格的繼承樹最頂端)】
                 System.Object (老祖宗:只會 ToString, GetType)
         ┌─────────────┴─────────────┐
      Mammal (水獺藍圖)            Reptile (蜥蜴藍圖)
    (.Name 寫在這裡)

 變數 object boxed ───> [ 拿著最頂層的合約 ] ───> 雖然指著 Mammal 實體,但強制不准讀取 .Name!

=======================