請解釋C#等號成員和相等比較器之間的區別,以及如何選擇哪一個是必需的,以及在什麼情況下使用它們?在c#中,等式成員和等號比較器之間有什麼區別,你應該使用哪一個?
我特別感興趣的是LINQ操作或在.NET操作或類型內進行比較時構建的其他語言 - 例如,Dictionary鍵。
謝謝。
請解釋C#等號成員和相等比較器之間的區別,以及如何選擇哪一個是必需的,以及在什麼情況下使用它們?在c#中,等式成員和等號比較器之間有什麼區別,你應該使用哪一個?
我特別感興趣的是LINQ操作或在.NET操作或類型內進行比較時構建的其他語言 - 例如,Dictionary鍵。
謝謝。
假設 - C#平等成員 - 前。等於(...)方法。 c#平等比較器 - 例如IEqualityComparer接口。
簡而言之,在Equality Compare的幫助下,您可以提高代碼的可用性。
例如,您正在構建一個車輛目錄,並且您要確保密鑰(型號和代碼不同)。現在這個邏輯適用於任何類型的車輛。因此,定義一個默認比較器並將它用於任何地方都是一個好主意。
這是給你參考的例子:
using System;
using System.Collections.Generic;
using ConsoleApplication3;
public class Program
{
internal class Car : IVehicle
{
public List<string> Features { get; set; }
public string ModelNumber { get; set; }
public string ModelCode { get; set; }
}
internal class Bike : IVehicle
{
public string ModelNumber { get; set; }
public List<string> Features { get; set; }
public string ModelCode { get; set; }
}
public static void Main()
{
var carCatelogue = new Dictionary<Car, int>(new GlobalEqualityComparer());
var bikeCatelogue = new Dictionary<Bike, int>(new GlobalEqualityComparer());
carCatelogue.Add(new Car()
{
ModelCode = "100",
ModelNumber = "CAR-01",
Features = new List<string> { "BEST ENGINE", "5 GEAR", "SPOTY" }
}, 5);
carCatelogue.Add(new Car()
{
ModelCode = "100",
ModelNumber = "CAR-02",
Features = new List<string> { "SUPER FAST ENGINE", "4 GEAR", "SPOTY RED" }
}, 10);
// This Statement will throw exception because car-02 key already exists.
carCatelogue.Add(new Car()
{
ModelCode = "100",
ModelNumber = "CAR-02",
Features = new List<string> { "SUPER FAST ENGINE", "4 GEAR", "SPOTY RED" }
}, 10);
bikeCatelogue.Add(new Bike()
{
ModelCode = "200",
ModelNumber = "BIK-01",
Features = new List<string> { "800 CC", "10 GEAR", "SPOTY BLACK" }
}, 5);
// this will throw exception because the key is aleady exists.
bikeCatelogue.Add(new Bike()
{
ModelCode = "200",
ModelNumber = "BIK-01",
Features = new List<string> { "800 CC", "10 GEAR", "SPOTY BLACK" }
}, 5);
}
private class GlobalEqualityComparer : IEqualityComparer<IVehicle>
{
public bool Equals(IVehicle x, IVehicle y)
{
return x.ModelNumber.Equals(y.ModelNumber, StringComparison.CurrentCultureIgnoreCase)
&& x.ModelCode.Equals(y.ModelCode, StringComparison.CurrentCultureIgnoreCase);
}
public int GetHashCode(IVehicle obj)
{
return string.Format("{0}{1}", obj.ModelCode, obj.ModelNumber).GetHashCode();
}
}
}
在使用會員的情況下,如等於,你將不得不寫轎車相同的邏輯,以及自行車。
現在,當你想使用的地方,它會完全歸結於你。
如果您對基礎平等感到滿意,即將參考值與參考值進行比較,然後您可以使用它,而無需重寫。
如果你是特定於任何問題,你需要給我一個例子。
希望它有幫助。
依託ReSharper的幫助,平等成員將創建與X
類的對象比較X
類的其他對象的方法,並object
類型的對象。基本上,比較一切。
當與一個對象進行比較時,您會檢查它是否爲空,並且它是一個X
對象,如果其中一個失敗,則返回false,然後確保它們相等,具體取決於您決定的類的哪些屬性比較。
相等比較器創建一個類(一個對象),將負責比較類型爲X
的兩個對象。
例如,有串s1
和s2
,平等的成員,你可以這樣做:s1.Equals(s2)
和s1.Equals(some_other_object)
,並與比較器,你可以這樣做:String.Equals(s1,s2)
。
相同,但不同。