Имеется следующий код:
public class Fish
{
private readonly string name;
public Fish(string name)
{
this.name = name;
}
public override int GetHashCode()
{
return name.GetHashCode();
}
public override bool Equals(object obj)
{
var otherFish = obj as Fish;
if (otherFish == null)
{
return false;
}
return otherFish.name == name;
}
}
class Program
{
static void Main()
{
var duplicates = new Hashtable();
var key1 = new Fish("Herring");
var key2 = new Fish("Herring");
var key3 = new Fish("Herring2");
duplicates[key1] = "Hello";
duplicates[key2] = "Hello2";
duplicates[key3] = "Hello3";
Console.WriteLine(duplicates.Count);
// Delay.
Console.ReadKey();
}
}
При вызове строк
duplicates[key1] = "Hello" и duplicates[key3] = "Hello3" вызывается только метод GetHashCode(), а при вызове duplicates[key2] = "Hello3", вызывается метод Equals(). Как компилятор определил когда нужно вызывать метод Equals() и когда в этом нет потребности?
Если упростить, то хеш-таблица работает так:
GetHashCode() для ключаEquals(). То, что хеш-коды совпали, еще не значит, что Equals() вернет trueduplicates[key2] = "Hello2"; на этой строчке совпал хеш-код, но хеш-таблица должна проверить, равен ли ключ уже существующему в таблице, поэтому вызывается Equals()
На практике берется GetHashCode() % table_length, где table_length размер внутренней таблицы.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости