型別推斷

型別推斷與 var 關鍵字

觀察下方程式碼,變數開頭宣告的型別,編譯器完全能夠透過等號右側的初始值自動推導出來。舉例來說,下方的 18 是否可以推斷為整數 int,Phone() 能不能推導成 Phone 型別?

static void Main( )
{
    int age = 18; // 右側的18可直接推斷為int
    Phone p = new Phone(); // 右側建構子回傳Phone物件
}
Code language: C# (cs)

那麼上面這段程式碼,是否還有簡化的空間?

C# 提供 var 關鍵字簡化寫法,用來取代明確指定型別。

static void Main( )
{
    var age = 18;
    var p = new Phone();
}
Code language: JavaScript (javascript)

這段程式左邊的變數型別全部使用 var,編譯器會依據右側內容推斷左側型別,編譯完成之後,前後兩份程式碼執行效果完全相同。

注意事項

  1. var並非動態型別,只屬於語法簡寫;編譯器會在編譯階段鎖定推導出來的型別,後續無法更改;兩段程式語義完全相等。
  2. 使用 var 的強制規範:
    • 僅限使用在區域變數,不可用於類別的欄位
    • 宣告時一定要給初始值,不能只寫 var x;
    • 推導得到的型別固定,變數之後不能存放其他型別資料
  3. 重要區分:C# 的 var ≠ JavaScript 的 var。JS 的 var 屬於動態弱型別,變數可隨時切換存放不同型別;C# var 只是靜態強型別的簡寫,不會改變 C# 為強型別語言的特性。

也就是說上面的 var,在編譯時,編譯器會依右側內容推論,把 age 的型別轉為 int,p 轉為 Phone,最終與第一段程式碼沒有差異。

之後不能修改它們的型別。舉例如下:

class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();
    }
}

class Phone
{
    public string Name { get; set; }
}Code language: C# (cs)

上面這種寫法在 C# 中是錯誤的,但 JavaScript、PHP 等其他語言允許,它們容許變數隨意更換型別。

JS 與 PHP 屬於 弱型別、動態型別語言,變數本身沒有固定的型別限制。

錯誤範例


class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();

        var isBuy;
    }
}

class Phone
{
    var price = 1000;
    var model = "iPhone";

    int count = 12;
}Code language: C# (cs)

型別推斷

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *