簡體   English   中英

Process.Equals()不起作用

[英]Process.Equals() doesn't work

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) Function?,請提供任何示例?

Process不會覆蓋Equals方法,因此使用它的基類System.Object的一個來比較引用。 似乎Process.GetCurrentProcess()總是返回新實例,這意味着它們不是相同的引用。

文檔已經提到了它:

獲取一個新的 Process組件,並將其與當前活動的進程關聯。.....使用此方法創建一個新的Process實例,並將其與本地計算機上的進程資源關聯。

如果查看其來源,則會看到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

不需要類來提供相等性定義。 您在此處查看的Equalsobject.Equals(object,object) ,因此Process不會覆蓋它。 因此,您要測試的是引用相等

您有兩個不同的對象實例 - 代表相同的OS進程。 要查看它們是否代表相同的OS進程,請執行以下操作:比較進程ID( Process實例的Id屬性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM