9

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

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

我希望能够做到这一点:

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

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

4

2 回答 2

10

在 C# 中,classes 的实例作为引用传递,而structs 的实例通过副本传递(默认情况下)。

答案就在它应该在的地方:http: //msdn.microsoft.com/en-us/library/vstudio/ms173109.aspx

类是引用类型。当创建类的对象时,分配给该对象的变量只保存对该内存的引用。当对象引用分配给新变量时,新变量引用原始对象。通过一个变量所做的更改会反映在另一个变量中,因为它们都引用相同的数据。

结构是一种值类型。创建结构时,分配给结构的变量保存结构的实际数据。当结构被分配给一个新变量时,它被复制。因此,新变量和原始变量包含相同数据的两个单独副本。对一个副本所做的更改不会影响另一个副本。

于 2013-10-19T01:16:52.070 回答
4

您正在体验价值类型的影响之一。因为它在分配给新变量或作为参数传递时按值复制自身,而不是通过引用。

您可以使用方法签名中的关键字通过 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 进行修改。通过引用传递值类型时没有装箱。

于 2013-10-19T01:21:55.263 回答