我已经使用了很长一段时间的C ++ / CLI层。但是我刚刚发现了一些使我觉得需要重新学习的东西。
当我的C ++ / CLI函数收到任何托管类的实例时,它们将使用“ hat”运算符('^'),并且收到托管 struct < / strong>,但他们没有。我以为这就是我应该写的方式。
尽我所能地淡化
using Point = System::Windows::Point;
public ref class CppCliClass
{
String^ ReturnText(String^ text) { return text; } // Hat operator for class
Point ReturnStruct(Point pt) { return pt; } // No hat operator for struct
};
我认为这是必需的。当然可以。但是直到今天,我才发现CancellationToken是一个结构,而不是一个类。我的代码戴着帽子接受它。我写这本书的时候以为是一堂课。此代码可以正常工作。在C ++ / CLI层中,我的取消很荣幸。
void DoSomethingWithCancellation(CancellationToken^ token)
{
// Code that uses the token. It works just fine
}
显然,我可以选择任何一种方法。
但是,按值(就像我对其他所有使用的结构类型一样,如Point)和按引用(如对CancellationToken进行传递)传递结构之间有什么区别?有区别吗?
答案 0 :(得分:1)
^
用于引用类型,而对于不用于值类型,则与C#匹配,但是C ++ / CLI确实为您提供了更大的灵活性:
不带^
的引用类型称为“堆栈语义”,并在变量生存期结束时自动尝试在对象上调用IDisposable::Dispose
。就像一个C#using
块一样,除了更加用户友好。特别是:
无论类型是否实现IDisposable
,都可以使用语法。在C#中,如果可以在编译时证明类型可以实现using
,则只能编写IDisposable
块。 C ++ / CLI范围内的资源管理在通用和多态情况下工作良好,其中某些对象可以实现,而某些对象不实现IDisposable
。
该语法可用于类成员,并在包含的类上自动实现IDisposable
。 C#using
块仅适用于本地范围。
^
一起使用的值类型被装箱,但是确切地跟踪了确切的类型。如果传入其他类型的装箱值,则会出现错误。