[英]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
不需要類來提供相等性定義。 您在此處查看的Equals
是object.Equals(object,object)
,因此Process
不會覆蓋它。 因此,您要測試的是引用相等 。
您有兩個不同的對象實例 - 代表相同的OS進程。 要查看它們是否代表相同的OS進程,請執行以下操作:比較進程ID( Process
實例的Id
屬性)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.