Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# equals和ID比较之间的性能差异_C#_.net_Vb.net - Fatal编程技术网

C# equals和ID比较之间的性能差异

C# equals和ID比较之间的性能差异,c#,.net,vb.net,C#,.net,Vb.net,obj.equals(obj2)和object.ID==obj2.ID之间是否存在性能差异?我的理解是,equals将比id之间的比较慢,尤其是当数据集更大时,以及当我使用LINQ语句之类的语句查找一个项时 例如: class Person { int Id, string Name } Person a = new Person (1,"Steve"); Person b = new Person (2,"Peter"); //Scenario 1 if (a.equals

obj.equals(obj2)
object.ID==obj2.ID
之间是否存在性能差异?我的理解是,equals将比id之间的比较慢,尤其是当数据集更大时,以及当我使用LINQ语句之类的语句查找一个项时

例如:

class Person {
    int Id,
    string Name
}

Person a = new Person (1,"Steve");
Person b = new Person (2,"Peter");

//Scenario 1
if (a.equals(b)) {Console.WriteLine("True");}

//Scenario 2
if (a.Id == b.Id) {Console.WriteLine("True");}

这完全取决于
Equals
方法的实现方式。如果不重写它,默认行为是比较引用,因此具有相同ID的两个不同实例将不会被视为相等。因此,这不仅是一个性能问题,也是一个正确性问题


现在,假设您实现了
Equals
,以便比较这两个实例的ID:它将比直接调用ID慢一点(因为调用虚拟方法的开销),但差异可能太小而不明显。

这一切都取决于
Equals
方法的实现方式。如果不重写它,默认行为是比较引用,因此具有相同ID的两个不同实例将不会被视为相等。因此,这不仅是一个性能问题,也是一个正确性问题


现在,假设您实现了
Equals
,以便它比较两个实例的ID:它将比直接调用ID慢一点(因为调用虚拟方法的开销),但是差异可能太小而不明显。

如果不看类重写是否等于,就不可能说哪一个更快

默认情况下,如果类不重写
Equals
,则
a.Equals(b)
将执行对象
a
b
的引用比较(即使对象具有相同的
.Id
),而
a.Id==b.Id
将对被重写的
Id
执行比较(与数字类型类似)将比较ID的值


因此,在默认情况下,这两个完全不同的操作中的第一个在速度方面可能会快一点。

如果不查看类重写
是否等于
,就不可能说哪一个更快

默认情况下,如果类不重写
Equals
,则
a.Equals(b)
将执行对象
a
b
的引用比较(即使对象具有相同的
.Id
),而
a.Id==b.Id
将对被重写的
Id
执行比较(与数字类型类似)将比较ID的值


因此,在默认情况下,这两个完全不同的操作中的第一个在速度方面可能会快一点。

不,但在您的情况下,有一个技术上的操作。a等于(b)应该返回false,即使ID相同,除非您重写Equals运算符。使用重写Equals,您只能比较ID使其相等否,但在您的情况下,有一个技术性的。a.Equals(b)应该返回false,即使ID相同,除非重写Equals运算符。使用重写Equals,您只能比较ID使其相等。在本例中,我不一定关心对象比较的输出。我只是想知道哪一个更快,而不必重写
Equals
@sujithgokul,我怀疑默认实现相当快,但唯一确定的方法是对其进行基准测试。@sujithgokul:您应该关心比较的正确性。缓慢的正确答案比快速的错误答案要好。您的两个示例所做的不是同一件事(除非您覆盖
Equals
)@Thomas Levesque:有道理。我只是想知道默认实现是否比ID比较慢。我不一定关心本例中对象比较的输出。我只是想知道在不重写
equals
@sujithgokul的情况下哪个更快,我怀疑默认实现是on非常快,但唯一确定的方法是对其进行基准测试。@sujithgokul:您应该关注比较的正确性。缓慢的正确答案比快速的错误答案要好。您的两个示例所做的事情并不相同(除非您覆盖
等于
)@Thomas Levesque:有道理。我只是想知道默认实现是否比ID比较慢