gpt4 book ai didi

c# - 引用平等表现差异? ((object)obj1 == (object)obj2) 与 object.ReferenceEquals( obj1, obj2 )

转载 作者:IT王子 更新时间:2023-10-29 04:42:23 24 4
gpt4 key购买 nike

使用 object.ReferenceEquals 方法与使用 ((object)obj1 == (object)obj2) 是否有额外的开销?

在第一种情况下,会涉及静态方法调用,而在这两种情况下,都会涉及某种形式的对象转换。

即使编译器平衡了这些方法,不等式又如何呢?

(object)obj != null

与...相比

!object.ReferenceEquals(obj,null)

我想在某些时候,逻辑否定会发生,要么在 != 运算符内,要么应用于 ReferenceEquals 方法的结果。你怎么看?

还有可读性问题需要考虑。 ReferenceEquals 在检查相等时似乎更清晰,但对于不等式,人们可能会错过 object.ReferenceEquals 之前的 !,而 != 在第一个变体中很难被忽视。

最佳答案

Is there extra overhead in using the object.ReferenceEquals method

没有。该方法直接包含执行引用相等性检查的最小 IL 描述(记录:它等同于 VB 的 Is 运算符)并且通常会被 JIT 内联(尤其是针对 x64 时),因此没有开销。

关于可读性:我个人认为 object.ReferenceEquals 可能更具可读性(即使是否定形式),因为它明确表达了它的语义。转换为 object 可能会让一些程序员感到困惑。

我刚刚发现 an article 正在讨论这个问题。它更喜欢 (object)x == y,因为 IL 占用空间更小。它认为这可能有助于使用此比较内联方法 X。然而(虽然没有任何关于 JIT 的详细知识,但逻辑上和直觉上)我认为这是错误的:如果 JIT 的行为类似于优化 C++ 编译器,它将考虑方法 after 内联对 ReferenceEquals 的调用,所以(为了内联方法 X)内存占用将完全相同。

也就是说:选择一种方式而不是另一种方式对 JIT 和性能没有任何影响。

关于c# - 引用平等表现差异? ((object)obj1 == (object)obj2) 与 object.ReferenceEquals( obj1, obj2 ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com