Я создаю ключ для словаря, который представляет собой структуру из двух строк. Когда я тестирую этот метод в консольном приложении, он работает, но я не уверен, что единственная причина, по которой он работает, заключается в том, что строки интернированы и поэтому имеют одинаковые ссылки.Зависит ли этот код от интернирования строк?
Foo foo1 = new Foo();
Foo foo2 = new Foo();
foo1.Key1 = "abc";
foo2.Key1 = "abc";
foo1.Key2 = "def";
foo2.Key2 = "def";
Dictionary<Foo, string> bar = new Dictionary<Foo, string>();
bar.Add(foo1, "found");
if(bar.ContainsKey(foo2))
System.Console.WriteLine("This works.");
else
System.Console.WriteLine("Does not work");
структура просто:
public struct Foo
{
public string Key1;
public string Key2;
}
Есть ли случаи, которые вызывали бы это потерпеть неудачу или я хорошо полагаться на это как уникальный ключ?
Другая цитата из документации GetHashCode: реализация GetHashCode по умолчанию не гарантирует уникальность или согласованность; поэтому он не должен использоваться как уникальный идентификатор объекта для целей хэширования. –
Да, верно для большинства типов. Для строк он говорит, что он правильно реализован, поэтому вы можете положиться на это. – rui
Кажется, что строки работают как есть, а потому, что нет никакой явной гарантии для этого * всегда * в том случае, если я переопределяю GetHashCode и Equals. Спасибо всем за советы! –