C# 关于何时使用临时对象来保存对对象的引用,而不是每次使用时引用整个路径的经验法则?

C# 关于何时使用临时对象来保存对对象的引用,而不是每次使用时引用整个路径的经验法则?,c#,arrays,performance,unity3d,C#,Arrays,Performance,Unity3d,我想这个问题在很大程度上取决于你喜欢什么,也取决于你的情境,但我今天遇到了一条通往游戏对象的道路,有一个很长的参考资料,我想如果临时参考资料不适合这种情况的话 守则: if (enlargeableButtons[i][j].gameObject.activeSelf && enlargeableButtons[i][j].IsHighlighted()) { enlargeableButtons[i][j].gameObject.SetIsHighlighted(tru

我想这个问题在很大程度上取决于你喜欢什么,也取决于你的情境,但我今天遇到了一条通往
游戏对象的道路,有一个很长的参考资料,我想如果临时参考资料不适合这种情况的话

守则:

if (enlargeableButtons[i][j].gameObject.activeSelf && enlargeableButtons[i][j].IsHighlighted())
{
    enlargeableButtons[i][j].gameObject.SetIsHighlighted(true, HoverEffect.EnlargeImage);
}
如果路径如此长,需要检查多个数组索引,则速度肯定会更快,但由于额外的对象,这样做的成本也会更高:

GameObject temp = enlargeableButtons[i][j].gameObject;

if (temp.activeSelf && temp.IsHighlighted())
{
    temp.SetIsHighlighted(true, HoverEffect.EnlargeImage);
}

但是它值多少钱,值多少钱呢?

声明
GameObject temp
只是创建了一个对
可放大按钮[i][j]的引用。GameObject
。这是额外的开销,但不多。除非你重复上千次或更多次,否则你不会注意到差异


作为个人规则,如果我只需要引用它一次,我不需要为它声明变量。但是,如果我需要多次使用类似于
enlargeableButtons[I][j].gameObject的东西,那么我声明一个变量。

我严重怀疑,使用直接引用而不是通过锯齿数组,您是否会看到任何性能提升。
如果这段代码在一个非常紧密的循环中运行,并且有很多次迭代,您可能会得到几毫秒的差异

然而,从可读性的角度来看,第二个选项更具可读性——因此我肯定会选择它

通常-您应该为清晰而不是性能而设计代码。 编写代码,以尽可能清晰的方式传达它正在实现的算法。 设定性能目标,并根据这些目标衡量代码的性能。 如果您的代码没有达到您的性能目标,请找出瓶颈并加以处理。 在设计代码时,不要把时间浪费在纳米优化上

还有一个个人故事来说明我的意思:

我曾经写过一个项目,在那里我有很多
obj.child.grant
调用。在开始编写项目后,我意识到会有很多调用,我只是在我正在处理的类上创建了一个属性,引用了那个孙子,我的代码突然变得更好。

这看起来像是过早优化的一个主要例子。它不是临时对象,而是临时变量。C#中的变量包含结构(值类型)或引用(或更罕见的指针)。单个对象可以有多个引用,而引用本身非常小。这看起来像是编译时优化的候选对象。有人能验证当存在数组引用时C#是否会处理这个问题吗?这只对减少代码行长度的可读性有利。就这样。除非您调用Unity API来搜索游戏对象,例如
GameObject.Find()
,否则您不会注意到任何性能提升。我更新了我的措辞以澄清这一点。增加一个局部变量的代价仅仅是在设置帧时,堆栈帧会增加一个额外的单词。这实际上没有任何成本,除非它导致stackoverflowexception,这实际上不是一个真正的问题。