- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
是使用 static Object.Equals 的代码检查空值比使用 == 运算符或 regular Object.Equals 的代码更健壮?后两者不是很容易被覆盖,以至于检查 null 不能按预期工作(例如,当比较值为 null 时返回 false)?
换句话说,是这样的:
if (Equals(item, null)) { /* Do Something */ }
if (item == null) { /* Do Something */ }
最佳答案
这个问题没有简单的答案。 在我看来,任何说总是使用一个或另一个的人都给了你糟糕的建议。
实际上,您可以调用几种不同的方法来比较对象实例。给定两个对象实例 a
和 b
,你可以写:
Object.Equals(a,b)
Object.ReferenceEquals(a,b)
a.Equals(b)
a == b
Object.Equals(a,b)
将(默认情况下)对引用类型执行引用相等比较和对值类型执行按位比较。从 MSDN 文档:
The default implementation of Equals supports reference equality for reference types, and bitwise equality for value types. Reference equality means the object references that are compared refer to the same object. Bitwise equality means the objects that are compared have the same binary representation.
Note that a derived type might override the Equals method to implement value equality. Value equality means the compared objects have the same value but different binary representations.
Object.ReferenceEquals(a,b)
仅执行引用相等比较。如果传递的类型是装箱值类型,则结果总是
false
.
a.Equals(b)
调用
Object
的虚拟实例方法,其中
a
的类型可以覆盖做任何它想做的事情。调用是使用虚拟调度执行的,因此运行的代码取决于
a
的运行时类型.
a == b
调用
a
的 **compile-time type* 的静态重载运算符.如果该运算符的实现调用
a
上的实例方法或
b
,它也可能取决于参数的运行时类型。由于分派(dispatch)基于表达式中的类型,因此以下可能会产生不同的结果:
Frog aFrog = new Frog();
Frog bFrog = new Frog();
Animal aAnimal = aFrog;
Animal bAnimal = bFrog;
// not necessarily equal...
bool areEqualFrogs = aFrog == bFrog;
bool areEqualAnimals = aAnimal = bAnimal;
operator ==
检查空值存在漏洞. 在实践中,大多数类型
不要过载
==
- 但永远没有保证。
Equals()
这里没有更好的。虽然默认实现执行引用/按位相等性检查,但类型可能会覆盖
Equals()
成员方法,在这种情况下将调用此实现。用户提供的实现可以返回它想要的任何东西,即使与 null 相比也是如此。
Object.Equals()
的静态版本呢?你问?这最终可以运行用户代码吗?好吧,事实证明答案是肯定的。
Object.Equals(a,b)
的实现扩展到以下方面:
((object)a == (object)b) || (a != null && b != null && a.Equals(b))
class Foo {
public override bool Equals(object obj) { return true; } }
var a = new Foo();
var b = new Foo();
Console.WriteLine( Object.Equals(a,b) ); // outputs "True!"
Object.Equals(a,b)
当调用中的任何一种类型都不是
null
时运行用户代码.请注意
Object.Equals(a,b)
不调用
Equals()
的实例版本当任一参数为空时。
Object.Equals(a,b)
的内部行为。 .
如果您需要在不运行任何其他代码的情况下将引用与 null 进行比较的铁定保证,您需要 Object.ReferenceEquals()
:
Object.ReferenceEquals(item, null);
Object.Equals(a,null)
的好处在这里, 是不是不太可能有人稍后过来说:
a.Equals(null)
或
a == null
a == null
.内置 .NET 类,如
String
和
Nullable<T>
有明确定义的语义进行比较。此外,它们是
sealed
- 防止通过继承改变他们的行为。以下是很常见的(并且是正确的):
string s = ...
if( s == null ) { ... }
if( ReferenceEquals(s,null) ) { ... }
==
是安全和适当的。
关于c# - Equals(item, null) 或 item == null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3507383/
这里我试图在 FlatList 中显示一个名为“posts”的数组。 render() { console.log(this.props.posts); return (
这是我的代码: {{day(list)}} {{list.weather[0].description}}
我是 Mahout 的新手,并且仍在使用它。 我的问题是,将 Item-Item 和 User-Item 结合起来是否合适? 我的用例是,一个社交网络应用会尝试根据用户历史数据(优先级较高)为当前用户
下午好, 我按数据库搜索以测试特定类测试,当我放置一个新项目时,如果列表包含该项目。 @Test public void insertAndDeleteTask() throws Interrupte
我有一个关于 ionic 框架的问题,我希望有人能帮助我...我有一个带有“ion-item-right”的 ionic 列表。这一切都可以,按钮在右边。现在我需要其他三个居中的图标,这样我就有了:文
我经常遇到类似下面的代码: if ( items != null) { foreach(T item in items) { //... } } 基本上,if 条件确
我最近问了a question about LocalStorage .使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
我最近问了a question about LocalStorage .使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
这个问题已经有答案了: Type mismatch: cannot convert from Item to Item (1 个回答) 已关闭 7 年前。 我很困惑。我无法将外部类的实例变量 Node
我目前正在使用 MUI Grid(但我对替代解决方案持开放态度)并且我想要并排放置两个组件:最右边的组件占 400px宽度和左侧组件占据其余部分。 || || || 当页面宽度缩小时: | | ||
我最近问过a question about LocalStorage 。使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
public class Document extends Model { ... @ManyToMany public Set accessors; ... } 我想选择访问者包含某个用户的所有文档
我正在使用 selenium webdriver 为单页 Web 应用程序开发一个 Java 框架,使用以下模式:PageObject、SlowLoadableComponent(责任链)、PageF
最近在学习C,在网上发现了一个问题。问题是: What is the problem with this function in terms of memory allocation? What is
我有这个代码 ( -1 ? true : false} /> {genre.item.name}
在ASP.Net中使用DataGrid时真的没有快捷方法吗 (e.Item.ItemType==ListItemType.Item || e.Item.ItemType==ListItemType.A
我正在使用工作流程根据数据和一组要求将大量 pdf 从一个位置复制到其他大坝位置。我正在使用以下代码 Assets damAsset = manager.createAsset(path, is, m
我是 PowerShell 的新手。 我正在尝试自动将 dll 组件从源服务器上的文件夹部署到目标服务器上的多个文件夹。这看起来应该很简单:将组件从源服务器上的源(部署)文件夹复制到目标服务器上的文件
我的代码: for column_name, column_data in summary_words.iteritems(): if column_name != "summary" and
我的代码: for column_name, column_data in summary_words.iteritems(): if column_name != "summary" and
我是一名优秀的程序员,十分优秀!