我应该如何按值传递数组?克隆()不气馁吗?

Rav*_*mer 3 c# arrays pass-by-value

我一直在调试我的C#程序,经过几次无结果的时间跨度,发现错误来自"意外"通过引用而不是值传递数组.

这是一些伪代码:

//1st pass
currentVertices = levels[0].vertices;   
currentVertices[0].Position.Z -= 10;

//2nd pass
currentVertices = levels[1].vertices;
currentVertices[0].Position.Z -= 10;

//3rd pass
currentVertices = levels[0].vertices;
currentVertices[0].Position.Z -= 10;  

//currentVertices[0].Position.Z is now 10 less than expected;
//20 less than it started. Further loops will increase the difference in expected
//value.
Run Code Online (Sandbox Code Playgroud)

我没想到会通过引用传递数组,但无论如何我不小心这样做了.

有没有办法按而不是按引用分配数组?我知道我可以迭代两个数组,分别指定每个术语,但这似乎不必要地复杂.我有理由相信Clone()函数,克隆,没有相应引用的值,但是这是按值分配的唯一方法吗?即currentVertices = levels[1].vertices.Clone();

Clone()一般不气馁吗?按值传递数组的最佳做法是什么?

在短期内,我只是硬编码加载后的值应该是什么.

正如我的一位主持人朋友所说,

"我看到你通过旁路参考解决了传递引用."

Joh*_*zen 5

好吧,在C#中,只有"按值"传递值类型.(这是过于简单化,但这是一种看待它的好方法.)其他所有东西实际上都是一个通过值传递的引用,类似于传递指针.(请注意,这与传递"by ref"不同,后者允许在调用方法中更新变量.)

您有两种选择:

  1. 重构您的代码以避免改变数组中的对象
  2. 深度克隆数组

这些大致按我推荐的顺序排列.

  • "没有任何语言可以按值传递数组." 在PHP中,默认情况下所有数组都按值传递. (2认同)