The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

何謂「強型別」(Strong Type)

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

我摘錄 MSDN 上的 有效率地使用資料型別 文件說明:

指定所有變數的資料型別稱為「強型別」。使用強型別有以下幾點好處:

  • 讓 IntelliSense® 能夠支援變數。這能讓您在輸入程式碼時看到變數的屬性及其他成員。
  • 可以利用編譯器型別檢查,這能找出可能因錯誤 (例如溢位) 而在 Run Time 失敗的陳述式。這也能夠偵測在不支援變數的物件上所進行的方法呼叫。
  • 執行程式碼的速度較快。

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

Strongly-typed programming language
http://en.wikipedia.org/wiki/Strong_typing

強類型 ( 強類型 == 強型別 )
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)