if (Process.Equals(Process.GetCurrentProcess(), Process.GetCurrentProcess()))
Console.WriteLine("i am the same as my self");
else
Console.WriteLine("i am not the same as my self");
Console.ReadKey();
它打印"我和我的自己不一样"
问题是什么?
以及我如何使用Equals(Object a, Object b)
函数?,请问任何例子吗?
答案 0 :(得分:6)
Process
不会覆盖Equals
方法,因此使用来自它的基类System.Object
的方法,它只是比较引用。似乎Process.GetCurrentProcess()
总是返回新实例,这意味着它们不是同一个引用。
documentation已提及:
获取新流程组件并将其与当前组件关联 活跃过程..... 使用此方法创建新流程实例,并将其与本地计算机上的流程资源相关联。
如果您查看source,则会看到new Process(...)
(阅读new
-operator):
public static Process GetCurrentProcess() {
return new Process(".", false, NativeMethods.GetCurrentProcessId(), null);
}
如果要检查两个流程实例是否相等,可以编写自定义比较器:
public class ProcessIdComparer : IEqualityComparer<System.Diagnostics.Process>
{
public bool Equals(Process x, Process y)
{
if (x == null && y == null) return true;
if (x == null || y == null) return false;
return x.Id == y.Id;
}
public int GetHashCode(Process obj)
{
return obj?.Id.GetHashCode() ?? 0;
}
}
现在您可以检查两者是否具有相同的ID:
Process p1 = Process.GetCurrentProcess();
Process p2 = Process.GetCurrentProcess();
bool equalProcesses = new ProcessIdComparer().Equals(p1, p2); // true
答案 1 :(得分:4)
类不是必需来提供相等定义。您在这里看到的Equals
是object.Equals(object,object)
,而Process
不会覆盖此问题。所以你要测试的是引用相等。
您有两个不同的对象实例 - 代表相同的操作系统进程。要查看它们是否代表相同的操作系统进程:比较进程ID(Id
实例的Process
属性)。