Вы можете избежать использования null и создать специальный класс одноэлементных значений, который делает то же самое. Например:
public sealed class Nothing
{
public static readonly Nothing Value = new Nothing();
private Nothing() {}
}
Dictionary<object, string> dict = new Dictionary<object, string>();
dict.add(Nothing.Value, "Nothing");
dict.add(1, "One");
Этот подход не будет работать, если вы намерены сделать вашу коллекцию более строго типизированной - например, вы хотите, чтобы ключ был строкой. Поскольку строка запечатана, вы не можете наследовать ее, чтобы создать «специальное значение», заменяющее ноль. Ваши альтернативы становятся немного сложнее. Вы могли бы:
- Создать какое-то специальное постоянное значение для представления «пустого» / «нулевого» случая. Хакерский и определенно путь к путанице. Это может быть жизнеспособным подходом, если словарь является полностью приватным для некоторого класса реализации, и вы можете написать некоторые служебные методы Encode / Decode, чтобы избежать распространения знаний о том, как вы переводите ключи повсюду.
- Создайте собственную реализацию IDictionary, которая внутренне делегирует экземпляру Dictionary <> - за исключением случая нулевого значения. Это нарушает задокументированные ожидания для интерфейса IDictionary <>, который говорит, что нулевые ключи должны вызывать исключение. Но вы можете сойти с рук, если это единственный способ решить вашу реальную проблему. Это работает, только если вы владеете и создаете экземпляр словаря.
- Найдите способ решить вашу проблему, не сохраняя «нулевой» ключ в словаре. Например, рассмотрите возможность не заполнять нулевой ключ в словаре и иметь некоторую специальную логику для решения этой проблемы. Ключи должны быть хэшируемыми и сопоставимыми для работы с базовой реализацией, поэтому null обычно запрещен.
Кроме того, нужен ли ваш словарный ключ для ключа object
? Это может привести к незначительным ошибкам из-за использования ссылочного равенства, если вы предполагали, что Equals () будет оцениваться в качестве основы для сравнения.