#1 – 何謂「初始化」(Initialization)

在程式語言中,「初始化」(Initialization)是指在物件被建立(實例化)時,為它的屬性(Properties)狀態(State) 設定初始值的過程。這是一個物件準備好可以被使用的重要步驟。


初始化的核心意義

  1. 設定屬性的初始值
  • 當物件被創建時,系統會分配記憶體,並根據類別的設計給屬性賦予默認值或自定義的初始值。
  • 如果屬性未被初始化,則它們通常會保留程式語言的預設值(例如,C# 中的數字為 0,字串為 null)。
  1. 物件處於可用狀態
  • 初始化的目的是讓物件進入一個一致且可用的狀態,避免物件在未設定值或配置不完整時使用,從而導致執行錯誤。

C# 中的初始化方式

在 C# 中,初始化通常透過以下幾種方式進行:


1. 預設值初始化

類別的屬性會自動獲得語言的預設值,這是最基本的初始化方式。


public class Dog
{
    public string Name; // 預設為 null
    public int Age;     // 預設為 0
}

當物件被實例化後:

Dog myDog = new Dog();
Console.WriteLine(myDog.Name); // 輸出:null
Console.WriteLine(myDog.Age);  // 輸出:0

2. 使用類別的建構函式

建構函式(Constructor)是類別的特殊方法,用於在物件被創建時執行初始化邏輯。

範例:

public class Dog
{
    public string Name;
    public int Age;

    // 建構函式
    public Dog(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

當你初始化物件時:

Dog myDog = new Dog("Buddy", 3);
Console.WriteLine(myDog.Name); // 輸出:Buddy
Console.WriteLine(myDog.Age);  // 輸出:3

這裡,建構函式 Dog(string name, int age) 負責初始化屬性 NameAge,保證物件的屬性有正確的初始值。


3. 使用物件初始化器

C# 提供了物件初始化器語法,允許你在實例化後直接設定屬性值,這是一種簡化初始化的方式。

範例:

public class Dog
{
    public string Name { get; set; }
    public int Age { get; set; }
}

使用物件初始化器:

Dog myDog = new Dog
{
    Name = "Buddy",
    Age = 3
};
Console.WriteLine(myDog.Name); // 輸出:Buddy
Console.WriteLine(myDog.Age);  // 輸出:3

這種方式省略了明確的建構函式調用,讓程式碼更簡潔。


4. 使用屬性或欄位的初始值

在類別內部直接為屬性或欄位賦值,提供一個初始值。

範例:

public class Dog
{
    public string Name { get; set; } = "Unknown";
    public int Age { get; set; } = 1;
}

當實例化時:

Dog myDog = new Dog();
Console.WriteLine(myDog.Name); // 輸出:Unknown
Console.WriteLine(myDog.Age);  // 輸出:1

初始化的完整流程

new Dog() 為例,物件初始化時經歷以下步驟:

  1. 分配記憶體:系統為物件分配記憶體,這段記憶體用於存儲物件的屬性和狀態。
  2. 屬性初始化
  • 如果屬性有預設值(例如 public int Age = 1;),則設置為預設值。
  • 如果使用建構函式,則依據建構函式邏輯設定屬性值。
  1. 物件進入可用狀態:物件的屬性值和行為都已準備妥當,可以開始使用。

初始化 vs 實例化

雖然「實例化」和「初始化」常常一起出現,但兩者有細微的區別:

  • 實例化(Instantiation)
    • 是指「創建一個物件」的過程。
    • 對應於 new 關鍵字後的整個動作。
    • 核心是讓物件在記憶體中有具體的存在。
  • 初始化(Initialization)
    • 是「設定物件屬性初始值」的過程。
    • 通常是實例化過程的一部分,但可以分開,例如在物件被實例化後進一步初始化。
    • 核心是保證物件的狀態正確且一致。

具體例子:DatabaseConnection 的初始化

以資料庫連線為例:

public class DatabaseConnection
{
    public string ConnectionString { get; set; }
    public bool IsConnected { get; private set; }

    public DatabaseConnection(string connectionString)
    {
        ConnectionString = connectionString;
        IsConnected = false;
    }

    public void Connect()
    {
        if (!string.IsNullOrEmpty(ConnectionString))
        {
            IsConnected = true;
            Console.WriteLine("Connected to database.");
        }
    }
}

實例化並初始化:

DatabaseConnection connection = new DatabaseConnection("Server=myServer;Database=myDB;");
connection.Connect();

步驟:

  1. 實例化
  • 系統創建一個 DatabaseConnection 物件。
  • 記憶體中分配空間,存放屬性 ConnectionStringIsConnected
  1. 初始化
  • 建構函式將 ConnectionString 設定為 "Server=myServer;Database=myDB;"
  • 預設將 IsConnected 設定為 false

總結


「一切從零開始,
未命名的風穿越海面,
語言的種子落入時間,
初生之光,給世界一個方向。」

——楊牧,《起源之書》