近来接到几个朋友问Visual C++ 2005 (C++/CLI) Webcast中讲的“值类型的强类型装箱实例”是什么?
讲座比较匆忙,因此对这个技术点只是点了一下,没有详细展开。这里借blog把它展开说一下。
首先来看下面的C#代码:
using System; using System.Collections; struct MyClass { public int data; } class Test { public static void Main() { MyClass myClass1 = new MyClass(); MyClass myClass2=new MyClass(); ArrayList list=new ArrayList(); list.Add(myClass1); list.Add(myClass2); Print(list); for(int i=0;i<list.Count;i++) { MyClass temp=(MyClass)list[i]; temp.data=i+1; list[i]=temp;// 注意这句话 } Print(list); } public static void Print(ArrayList list) { for(int i=0;i<list.Count;i++) { MyClass temp=(MyClass)list[i]; Console.WriteLine(temp.data); } } } |
其中list[i]=temp这句话很重要,否则无法实施改变,因为temp是一个“和list中hold的boxed的值实例无关的”stack上的实例。
但是如果使用C++/CLI,我们就可以这么做:
using namespace System; using namespace System::Collections; value class MyClass { public: int data; }; void Print(ArrayList^ list); int main() { MyClass^ hMyClass1 = gcnew MyClass; MyClass^ hMyClass2 = gcnew MyClass; ArrayList^ list=gcnew ArrayList(); list->Add(hMyClass1); list->Add(hMyClass2); Print(list); for(int i=0;i<list->Count;i++) { MyClass^ temp=(MyClass^)list[i]; temp->data=i+1; // 注意这里无需再有list[i]=temp这句话,因为temp引用的就是“list中hold的boxed的值实例” } Print(list); } void Print(ArrayList^ list) { for(int i=0;i<list->Count;i++) { MyClass^ temp=(MyClass^)list[i]; Console::WriteLine(temp->data); } } |