Process.Equals()不起作用

时间:2017-12-08 13:38:18

标签: c#

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)函数?,请问任何例子吗?

2 个答案:

答案 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)

类不是必需来提供相等定义。您在这里看到的Equalsobject.Equals(object,object),而Process不会覆盖此问题。所以你要测试的是引用相等

您有两个不同的对象实例 - 代表相同的操作系统进程。要查看它们是否代表相同的操作系统进程:比较进程ID(Id实例的Process属性)。