C#按值传递对象?

时间:2013-10-19 01:14:27

标签: c#

出于某种原因,(我是C#的新手并且知道java和c ++)当我想要传递值时,C#会继续复制对象。我有一个Vector2类的arraylist,每当我想增加一个值时,我必须这样做:

Vector2 d = (Vector2) myObjects[i];
d.Y++;
myObjects [i] = d;

我希望能够做到这一点:

Vector2 d = (Vector2) myObjects[i];
d.Y++;

完成。我在网上搜索,令人惊讶的是没有答案。 顺便说一句,向量是一个结构。

2 个答案:

答案 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   参考类型。传递时没有值类型的装箱   通过引用。