如果我通过常量引用在C ++中传递对象,如何在C#中传递对象?

时间:2017-06-01 18:14:42

标签: c# c++ parameter-passing

如果我像这样在C ++中传递一个对象:

template<typename MyType>
[public] MyType myMethodOrFunction(const MyObject& obj) {}

以下内容在C#中是否相同:

[public] MyType myMethodOrFunction<T>(MyObject obj) {}

这里问的问题完全相同: Const function parameter in C#

3 个答案:

答案 0 :(得分:0)

不,它不会有完全相同的语义。您显示的C#代码与在C ++中按值传递指针具有相同的语义,而不是通过引用传递值。您可以使用refout在C#中通过引用传递参数,但不能传递只读引用;这样的引用总是可变的,因此无法为C#中的C ++代码提供相同的语义。也就是说,虽然语义不相同,但它应该是一个类(在C#中值类型相当罕见)并且它可能应该通过值传递,它应该是再一次很少需要,只是意识到它不会有完全相同的语义。

答案 1 :(得分:0)

不完全是。

我认为你最接近的是:

public T myMethodOrFunction<T>(ref MyObject obj) {}

在C#中,你不会在这个环境中拥有const。值得注意的是obj可以是引用或值类型。用C ++术语来说,差异在于引用类型本质上是指针(MyObject *),而值类型只是值(MyObject)。因此,如果obj是值类型,那么它更接近C ++版本。

答案 2 :(得分:0)

您可以在另一种.NET语言C ++ / CLI中非常关闭:

ref class Foo sealed {};
void fooFunc(const Foo% foo)
{
}

int main(array<System::String ^> ^args)
{
    auto foo = gcnew Foo();    
    fooFunc(*foo);

    return 0;
}

生成的代码使用IsConst modopt:

.method assembly static void  fooFunc(class Foo modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modreq([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) foo) cil managed
{
} 

.method assembly static int32  main(string[] args) cil managed
{

  IL_0025:  call       void fooFunc(class Foo modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modreq([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced))

} 

因此,您将无法从其他.NET语言(如C#)中调用这些例程。