在 Java 語言中,基本型別 (Primitive Type,例如 byte、int、boolean、char、short、long、float 和 double) 為實值型別 (Value Type)。所有其他型別為參考型別 (Reference Type)。在其他的 .NET Framework 語言中,可以定義上述型別以外的實值型別。Visual J# 提供 Java 語言的擴充,讓這些定義在其他 .NET Framework 語言的實值型別可以在 J# 程式碼中使用,而且在 Visual J# 2005 中,J# 也可以在語言中撰寫實值型別。
實值型別和參考型別在許多方面不同。下列陳述式對於實值型別為真:
-
實值型別儲存在堆疊上,而不是在堆積 (Heap) 上。
-
實值型別以傳值 (By Value) 方式傳遞,而不是以傳址 (By Reference) 方式傳遞。
-
實值型別在指派時會複製整個物件,而不只是複製參考。
-
在做相等比較時,會比較整個實值型別物件來檢查是否相符,而不只是比對參考。
-
無法從實值型別衍生。
-
實值型別不需要建構函式。
如需詳細資訊,請參閱一般型別系統中的實值型別。
Visual J# 編譯器讓您使用在 .NET Framework 或其他使用者定義組件中定義的實值型別。實值型別的執行個體 (Instance) 可以直接在 Visual J# 中做為 Object 使用。Visual J# 編譯器會隱含地執行必要的 boxing;當實值型別指派給 Object 型別的變數時,會建立 Proxy 物件並針對實值型別包裝 (也就是 box) Proxy 物件。同樣的,將物件轉型成實值型別時,編譯器會執行 unboxing,將實值型別從物件包裝中擷取出來。Boxing 會自動對定義在 J# 或其他語言中的實值型別執行,但是不會對 Java 語言的基本型別執行。如需詳細資訊,請參閱使用和基本型別相對應的實值型別和使用者定義實值型別。
// vjc_valuetypes1.jsl
import System.*;
public class MyClass
{
public static void main(String [] args)
{
// DateTime is a value type; use it like a reference type.
DateTime dt = new DateTime();
dt = DateTime.Parse("01/01/2002 12:00");
// Automatically box value type dt to System.Object.
System.Object obj = dt;
// Obj unboxed to the value type DateTime.
DateTime dt2 = (DateTime) obj;
dt2 = DateTime.Parse("01/01/2003 12:00");
}
}
在這些程式碼中,DateTime 是在 .NET Framework 程式庫中定義的實值型別。雖然語法和參考型別相同,但是產生的程式碼差異很大,因為實值型別的作業是堆疊式的,而不是堆積式的。相較於使用參考型別,這有效能上的好處,因為不需要 boxing 和 unboxing,而且實值型別是在堆疊上而不是堆積上,存取這個型別不需要間接取值 (Indirection)。
參考
.NET Framework 特定語法
實值型別 (C# 參考)
屬性和事件的公開