值類型是一種輕量級的C++/CLI類機制,非常適合於小型的數據結構,且從語義的角度來看,與數值(Value)類似。
與之相比,引用類型的實例--包括那些聲明在堆棧上的,是由垃圾回收器治理的,而值類型的實例卻不是。一般來說,一個值類較好的實現應只有一些數據成員,而不需要繼續性,這樣,在函數傳遞及返回值、或是賦值操作時,不會帶來巨大的數據開銷。
值類初印像
請看例1中的Point類,可以通過替換ref為value,來把一個引用類變為值類;與引用類(ref)相似,值類(value)也是一個包含了空格的要害字。與大家想像的一樣,值類(value)與值結構(value strUCt)之間唯一的區別就是,前者默認的可訪問性為private,而後者則為public。
例1:
using namespace System;
public value class Point
{
int x;
int y;
public:
//定義屬性X與 Y的讀寫實例
property int X
{
int get() { return x; }
void set(int val) { x = val; }
}
property int Y
{
int get() { return y; }
void set(int val) { y = val; }
}
//定義實例構造函數
Point(int xor, int yor)
{
X = xor;
Y = yor;
}
void Move(int xor, int yor)
{
X = xor;
Y = yor;
}
virtual bool Equals(Object^ obj) override
{
if (obj == nullptr)
{
return false;
}
if (GetType() == obj->GetType())
{
Point^ p = static_cast<Point^>(obj);
return (X == p->X) && (Y == p->Y);
}
return false;
}
static bool operator==(Point p1, Point p2)
{
return (p1.X == p2.X) && (p1.Y == p2.Y);
}
// static bool operator==(Point% p1, Point% p2)
// {
// return (p1.X == p2.X) && (p1.Y == p2.Y);
// }
// static bool operator==(Point& p1, Point& p2)
// {
// return (p1.X == p2.X) && (p1.Y == p2.Y);
// }
virtual int GetHashCode() override
{
return X ^ (Y << 1);
}
virtual String^ ToString() override
{
return String::Concat("(", X, ",", Y, ")");
}
};
值類自動繼續自System::ValueType,而System::ValueType則繼續自System::Object,但是,這卻不能顯式地聲明。值類隱式表明了為"sealed",也就是說,它不能被作為一個基類,另外,為其類成員指定一個protected是沒有任何意義,並且也是不答應的。假如想顯式聲明一個值類(或引用類),可像如下所示:
value class X sealed {/*...*