如果我像这样在C ++中传递一个对象:
template<typename MyType>
[public] MyType myMethodOrFunction(const MyObject& obj) {}
以下内容在C#中是否相同:
[public] MyType myMethodOrFunction<T>(MyObject obj) {}
这里问的问题完全相同: Const function parameter in C#
答案 0 :(得分:0)
不,它不会有完全相同的语义。您显示的C#代码与在C ++中按值传递指针具有相同的语义,而不是通过引用传递值。您可以使用ref
或out
在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#)中调用这些例程。