﻿# 何謂「強型別」(Strong Type)

強型別 ( Strong Type ) 其實是一種觀念，是指「盡量使用具有型別的方式開發」，這樣的開發方式可以讓開發人員在「編譯時期(Compile-Time)」就能夠發現錯誤，減少「執行時期(Runtime)」發生錯誤的機會，因為「編譯時期」的錯誤可以透過「編譯器(Compiler)」在編譯的時候就幫你發現問題，找錯誤容易很多，而在「執行時期」的錯誤就比較難追蹤了，通常要有開發工具、還要下中斷點、... etc. 十分麻煩！ 

我摘錄 MSDN 上的 [有效率地使用資料型別](http://msdn2.microsoft.com/zh-tw/library/bt913yt6\(VS.80\).aspx "有效率地使用資料型別") 文件說明：

> 指定所有變數的資料型別稱為「強型別」。使用強型別有以下幾點好處：
> 
> -   讓 IntelliSense® 能夠支援變數。這能讓您在輸入程式碼時看到變數的屬性及其他成員。
>     
> -   可以利用編譯器型別檢查，這能找出可能因錯誤 (例如溢位) 而在 Run Time 失敗的陳述式。這也能夠偵測在不支援變數的物件上所進行的方法呼叫。
>     
> -   執行程式碼的速度較快。
>     

另外我也找了 Wikipedia 上的說明：

> Strongly-typed programming language  
> [http://en.wikipedia.org/wiki/Strong\_typing](http://en.wikipedia.org/wiki/Strong_typing)
> 
> 強類型 ( 強類型 == 強型別 )  
> [http://zh.wikipedia.org/wiki/%E5%BC%B7%E9%A1%9E%E5%9E%8B](http://zh.wikipedia.org/wiki/%E5%BC%B7%E9%A1%9E%E5%9E%8B)

我舉一個最常見的例子：

相信大家很常用 ASP.NET 的 Databinding 時所用的 Eval 語法:

> <%# Eval("Email") %>

這就是一個「非強型別」的例子，如果要將這行轉換成「強型別」的語法，可以改成：

> <%# ((Member)Container.DataItem).Email %>

如果你哪天真的把 Email 欄位改成 EmailAddress 後，重新 compile 專案時就會發現錯誤！

「強型別」的相反就是「弱型別」，一個簡單的判斷方法就是：

-   以 object 型別當變數型別的變數，或**無法明確表達執行時期變數的型別**，都屬於「弱型別變數」  
      
    例如：Eval("Email") 回傳的型別就是 object  
      
    
-   **程式所定義的變數型別**等同於**變數在執行時期的型別**，都通稱為「強型別變數」  
    \- or -  
    任何其他以明確的型別來宣告的變數，且在**執行時期**不會發生額外轉型的型別，都通稱為「強型別變數」(Strong-typed variables)
