出于某种原因,(我是C#的新手并且知道java和c ++)当我想要传递值时,C#会继续复制对象。我有一个Vector2
类的arraylist,每当我想增加一个值时,我必须这样做:
Vector2 d = (Vector2) myObjects[i];
d.Y++;
myObjects [i] = d;
我希望能够做到这一点:
Vector2 d = (Vector2) myObjects[i];
d.Y++;
完成。我在网上搜索,令人惊讶的是没有答案。 顺便说一句,向量是一个结构。
答案 0 :(得分:9)
在C#中,class
es的实例作为引用传递,而struct
的实例通过副本传递(默认情况下)。
答案就在那里:http://msdn.microsoft.com/en-us/library/vstudio/ms173109.aspx
类是引用类型。创建类的对象时,为其分配对象的变量仅保留对该内存的引用。将对象引用分配给新变量时,新变量引用原始对象。通过一个变量进行的更改会反映在另一个变量中,因为它们都引用相同的数据。
结构是一种值类型。创建结构时,为其分配结构的变量保存结构的实际数据。将结构分配给新变量时,会复制该变量。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。
答案 1 :(得分:3)
您正在体验价值类型的影响之一。因为它在分配给新变量或作为参数传递时按值复制,而不是通过引用复制。
您可以使用方法签名中的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修改,无论它是值类型还是a 参考类型。传递时没有值类型的装箱 通过引用。