在C ++ / CLI中使用“帽子”运算符与否都接受托管结构。有什么区别?

时间:2019-01-06 03:35:09

标签: c++-cli

我已经使用了很长一段时间的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进行传递)传递结构之间有什么区别?有区别吗?

1 个答案:

答案 0 :(得分:1)

^用于引用类型,而对于不用于值类型,则与C#匹配,但是C ++ / CLI确实为您提供了更大的灵活性:

  • 不带^的引用类型称为“堆栈语义”,并在变量生存期结束时自动尝试在对象上调用IDisposable::Dispose。就像一个C#using块一样,除了更加用户友好。特别是:

    • 无论类型是否实现IDisposable,都可以使用语法。在C#中,如果可以在编译时证明类型可以实现using,则只能编写IDisposable块。 C ++ / CLI范围内的资源管理在通用和多态情况下工作良好,其中某些对象可以实现,而某些对象不实现IDisposable

    • 该语法可用于类成员,并在包含的类上自动实现IDisposable。 C#using块仅适用于本地范围。

  • ^一起使用的
  • 值类型被装箱,但是确切地跟踪了确切的类型。如果传入其他类型的装箱值,则会出现错误。