为了账号安全,请及时绑定邮箱和手机立即绑定

C# 是否具有与 Java 相同的返回值和参数语义?

C# 是否具有与 Java 相同的返回值和参数语义?

C#
慕姐8265434 2023-04-29 18:12:07
我正在尝试通过 Unity 学习 C#,我想知道在参数和返回值的按引用传递或按值传递方面,C# 是否具有与 Java 相同的语义?我在 C# 语言中看到,您可以使用它ref来指示某些内容是按引用传递的,这是否意味着它默认情况下是按值传递的?Java 默认通过引用传递,除非它是原始类型(即不扩展自的东西Object)这包括 Java 中的数组。但我不确定 C#。
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

对于原始类型和非原始类型,Java 总是按值传递。


例如。,


void JavaMethod(int i, Foo f)

{

    i = 9; //not changed from caller's point of view

    f = new Foo(); //not changed from caller's point of view

}

除非使用“ref”关键字,否则 C# 是按值传递的:


void CSharpMethod(int i, Foo f, ref int j, ref Bar b)

{

    i = 9; //not changed from caller's point of view

    f = new Foo(); //not changed from caller's point of view


    j = 9; //changed from caller's point of view

    b = new Bar(); //changed from caller's point of view

}

在这两种语言中,您都可以在按值传递时修改非原始对象的内部状态:


void JavaOrCSharpMethod(Foo f)

{

    f.field = 9; //internal state is changed from caller's point of view

}

请记住将新实例分配给参数和修改对象的内部状态之间的区别。不理解这一点是很多关于这个主题的困惑的根源。


此外,除了原始类型没有改变其状态的成员之外,是否使用原始类型或非原始类型没有实质内容,因此它总是通过赋值完成。任何只能通过赋值改变状态的非原始类型看起来都是一样的。


我还会包括一些 C++ 示例,但这会使讨论变得非常复杂,因为 C++ 有许多实现按引用传递的方法。


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信