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); // }
value class X sealed {/*...*/}; 請注重,此處沒有默認的構造函數。對一個值類來說,CLI本身把類實例中所有字段的位都設置為零,所以,不能提供自己的默認構造函數;然而,零、false、nullptr對其他類型來說,也許并不是合適的默認值,因此,對某些特定類型來說,就要用引用類型來取代值類型了。(遵從C++/CLI的實現會將false與nullptr表示為位全部為零。)
Console::WriteLine("p2 is {0}", p2); Point% p4 = p3;
Point p5 = p2; p5 = p2;
Console::WriteLine("p1 == p2 is {0}", p1 == p2); Console::WriteLine("p1.Equals(p2) is {0}", p1.Equals(p2)); } p2 is (3,4) p1 == p2 is False p1.Equals(p2) is False 在第一次調用Console::WriteLine時,用傳值的方式傳遞進一個Point,但是,這個函數卻指望著接受一個對象引用,在此,Point值被自動裝箱,并把裝箱后的對象引用傳遞給函數。
C++/CLI類型CLI值類型boolSystem::Booleanwchar_tSystem::Charsigned charSystem::SByteunsigned charSystem::BytecharSystem::SByte或 System::Byteshort intSystem::Int16unsigned short intSystem::UInt16int System::Int32unsigned intSystem::UInt32long long intSystem::Int64unsigned long long intSystem::UInt64floatSystem::SingledoubleSystem::Double 表1:C++/CLI與CLI值類的映射關系