C ++和C#中指针和函数参数之间的等价性

时间:2017-02-05 17:30:15

标签: c# c++ .net

如果以下任何理解不准确,请与我们联系。

  1. MyClass m = new MyClass()< ---> MyClass * m = new MyClass;
  2. ??? (没有C#等价物)< ---> MyClass m(5,"foo");
  3. void SomeMethod(ref Widget w)< ---> void SomeMethod(Widget & w)void SomeMethod(Widget * * w)
  4. void SomeMethod(Widget w)< ---> void SomeMethod(Widget * w)
  5. ???(没有C#等价物)< ---> void SomeMethod(const Widget)
  6. ???(没有C#等价物)< ---> void SomeMethod(const & Widget)
  7. void SomeMethod(out Widget w)< ---> ??? (没有C ++等价物)

1 个答案:

答案 0 :(得分:1)

C#和C ++完全不同,超出了他们的名字所暗示的,但无论如何我都会尝试:

MyClass m = new MyClass() <---> MyClass * m = new MyClass;

大致相当,但C#将在不再使用后收集m。使用C ++,您必须记住delete对象。在C ++中,分配给堆栈或使用智能指针更加个性化。

??? (no C# equivalent) <---> MyClass m(5,"foo");

C#并没有给你很多控制对象分配的位置。但是,它有struct种类型可以避免堆分配。

void SomeMethod(ref Widget w) <---> void SomeMethod(Widget & w) or void SomeMethod(Widget * * w)

这些是类似的,但通常应避免使用C#ref

void SomeMethod(Widget w) <---> void SomeMethod(Widget * w)

这里的主要区别在于,在C ++中,任何具有指向对象的指针的人都可以删除它。在C#中,垃圾收集器处理删除。 C#有点像使用std::shared_ptr,但有周期检测。

??? (no C# equivalent) <---> void SomeMethod(const Widget)
??? (no C# equivalent) <---> void SomeMethod(const & Widget)

C#没有像C ++那样强大的const概念。通常,必须使用每个字段上的readonly关键字使整个类型不可变。

void SomeMethod(out Widget w) <---> ??? (no C++ equivalent)

在C ++中,通过引用获取对象可以实现与out变量相同的操作。 out变量通常是不好的做法,因此这个关键字是一种文档形式。

最重要的是,花时间了解代码是如何用每种语言编写的。许多概念是共享的,但要真正利用某项技术,您应该使用,而不是试图将一种范式强加于另一种范式。