【问题标题】:Beating Pass-By-Value the Best Way以最佳方式击败传递价值
【发布时间】:2014-03-01 06:36:01
【问题描述】:

(在下面的代码中,player 是一个包含 Vector2 的类型,称为 Vector

Vector2 v = player.Vector;
v.X -= player.Speed * (float)gameTime.ElapsedGameTime.TotalSeconds;
player.Vector = v;

对比

player.Vector = new Vector2(player.Vector.X - player.Speed * (float)gameTime.ElapsedGameTime.TotalSeconds, player.Vector.Y);

它们都完成了相同的任务(绕过“无法修改返回值,因为它不是变量”错误),但其中一个比另一个更有效?

一个人使用更少的内存吗? (没有权利?) 执行得更快吗? 有没有更好的办法?

【问题讨论】:

  • 大声笑,你只是在解决 XNA 问题! :)
  • @Evorlor 你得到了这个错误,因为 Vector2 是一个结构,所以你正在使用结构看这里msdn.microsoft.com/en-us/library/…
  • @Evorlor 看stackoverflow.com/questions/3729873/…这个帖子的第二个答案很高兴知道为什么你在工作时会收到“无法修改返回值,因为它不是变量”的错误with struct(以防你不知道)
  • 是的,我读了大约 3-4 次。乔恩斯基特规则:)
  • 当我查看您的问题时,我试图记住错误的原因,但我无法记住错误,然后我也搜索了错误:)

标签: c# vector xna pass-by-value


【解决方案1】:

第二个选项更好,因为它不会改变任何对象。为了提高可读性,我会提取一个像这样的变量:

var x = player.Vector.X - player.Speed * (float)gameTime.ElapsedGameTime.TotalSeconds;
player.Vector = new Vector2(x, player.Vector.Y);

【讨论】:

  • 在您的第一个代码中,您执行v.X = ...,这意味着您正在改变您的向量。使用变量x 允许您使用所需的值构造一个新向量。
  • 我不确定我是否理解。什么是谷歌的好词? :)
  • @Evorlor,有些人认为变异可能很危险,就像这里建议的那样:blogs.msdn.com/b/ericlippert/archive/2011/03/14/…
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多