C# 如果在C+中传递对象,如何在C中传递对象+;通过不断的引用? 如果我在C++中传递一个对象,像这样: template<typename MyType> [public] MyType myMethodOrFunction(const MyObject& obj) {} 模板 [public]MyType myMethodOrFunction(const MyObject&obj){}

C# 如果在C+中传递对象,如何在C中传递对象+;通过不断的引用? 如果我在C++中传递一个对象,像这样: template<typename MyType> [public] MyType myMethodOrFunction(const MyObject& obj) {} 模板 [public]MyType myMethodOrFunction(const MyObject&obj){},c#,c++,parameter-passing,C#,C++,Parameter Passing,以下内容在C#中是否等效: [public]MyType myMethodOrFunction(MyObject obj){ ? 这里提出了完全相同的问题: 不,它不会有完全相同的语义。您所显示的C代码与在C++中传递值的指针具有相同的语义,而不是通过引用传递值。可以使用ref或out在C#中通过引用传递参数,但不能传递只读引用;这样的引用总是可变的,因此无法在C++语言中提供与C++代码相同的语义。这就是说,虽然语义不完全相同,但可能是一个类(在C#中很少有值类型),并且应该通过值传递,否则

以下内容在C#中是否等效:

[public]MyType myMethodOrFunction(MyObject obj){
?

这里提出了完全相同的问题:
不,它不会有完全相同的语义。您所显示的C代码与在C++中传递值的指针具有相同的语义,而不是通过引用传递值。可以使用
ref
out
在C#中通过引用传递参数,但不能传递只读引用;这样的引用总是可变的,因此无法在C++语言中提供与C++代码相同的语义。这就是说,虽然语义不完全相同,但可能是一个类(在C#中很少有值类型),并且应该通过值传递,否则也很少需要,只是要意识到它不会有完全相同的语义。

不完全一样

我认为最接近你的是:

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

在C#中没有此上下文中的const。值得注意的是,obj可以是引用类型或值类型。C++中的不同之处在于,引用类型本质上是指针(MyObjt*),而值类型只是值(MyObjor)。因此,如果Objv是一个值类型,那么它更接近C++版本。P>注意,在C语言中有一个建议,包括参数,这样在将来可能发生的变化,如果我在C++中通过一个值传递一个对象,AndrewIgumenoff,同样的事情,在C++中通过一个值传递指针时,概念上会发生同样的事情。调用方没有观察到引用/指针本身的变化,通过调用方的引用可以观察到对被引用(或指向)对象的更改。@Servy,那么没有标准方法可以使该对象在方法或函数的范围内不可变吗?@AndrewIgumenoff Sure,有一个对象实现的只读接口,或者包装一个只公开只读操作的对象,并传递它。考虑到
MyObject
的名称,我认为假设它是一个对象,而不是一个结构,因此不是一个值类型是一个相当安全的假设。好的。但是他问如何写等价物,所以我认为在这里引用参考类型vs值类型是有帮助的,因为结构(值类型)会更接近C++版本。虫子的巨大来源。我没说它是虫子。在我看来,这是一个语言设计错误。Java没有常量引用,所以C#也没有。如果我们可以回去修复它…@NoelWidmer,正如我在其中一个答案中指出的,有一个(显然目前正在实施)NoelWidmer,我不会说,将某些东西转换成真正的类型并将其转换为与C++相比是一个问题,因为C++允许你在 COSTOSTCAST 中做本质上相同的事情。此时,开发人员正在故意做一些淘气的事情。@NoelWidmer您说过接口不能解决问题。他们很好地解决了问题,至少有人需要积极地尝试做一些他们能清楚地看到错误的事情,试图改变价值,他们的尝试甚至可能不起作用。这就是C++中的代码> const <代码>。在这两种情况下,它都是一个有用的特性,对于大多数目的来说都是足够的。
public T myMethodOrFunction<T>(ref MyObject obj) {}