C# 按值传递对象
本文关键字:对象 按值传递 | 更新日期: 2023-09-27 18:36:04
出于某种原因,(我是C#新手,知道java和c ++)当我想按值传递时,C#会不断复制对象。我有一个Vector2
类的数组列表,每当我想增加一个值时,我都必须这样做:
Vector2 d = (Vector2) myObjects[i];
d.Y++;
myObjects [i] = d;
我希望能够做到这一点:
Vector2 d = (Vector2) myObjects[i];
d.Y++;
并完成。我在网上搜索了一下,令人惊讶的是没有答案。顺便说一句,向量是一个结构。
在 C# 中,class
es 的实例作为引用传递,而 struct
的实例通过复制传递(默认情况下)。
答案就在它应该在的地方:http://msdn.microsoft.com/en-us/library/vstudio/ms173109.aspx
类是引用类型。创建类的对象时,为其分配对象的变量仅包含对该内存的引用。将对象引用分配给新变量时,新变量将引用原始对象。通过一个变量所做的更改会反映在另一个变量中,因为它们都引用相同的数据。
结构是一种值类型。创建结构时,为其分配结构的变量保存结构的实际数据。将结构分配给新变量时,将复制该结构。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。
您正在经历值类型的一种影响。因为它在分配给新变量或作为参数传递时按值复制自身,而不是按引用复制自身。
您可以通过 ref 传递结构或其他值类型,在方法签名中使用 ref
关键字,不幸的是,您不能使用它来将同一堆栈帧中的变量视为引用(即你不能只说ref int test = yourArray[0]
,但必须做类似这样的东西:
public void SomeMethod(ref Vector2 input) {
// now you are modifying the original vector2
}
public void YourOriginalMethod()
{
SomeMethod(yourArray[20]);
}
针对以下评论,来自 http://msdn.microsoft.com/en-us/library/14akc2c7.aspx:
不要将引用传递的概念与 引用类型。这两个概念是不一样的。方法参数 可以通过 ref 修改,无论它是值类型还是 引用类型。传递值类型时没有装箱 通过引用。