Одно из лучших применений - это то, что он довольно хорошо отображает пустые поля базы данных - помня об этом, вы хотите использовать его так же, как нулевое поле в базе данных.
То есть, нулевое значение не является "другим" - это означает, что оно неизвестно, или не поддается расчету в данный момент, или что, учитывая другие значения в этом объекте / записи, не имеет смысла, чтобы это было значением. Ваша ситуация звучит так, как будто она действительна - пользовательские настройки могут быть нулевыми, а фактические значения будут
actualValue = userValue ?? defaultValue;
??
является нулевым оператором объединения - вышеприведенное эквивалентно следующему:
actualValue = userValue.HasValue ? userValue : defaultValue;
или
actualValue = (userValue != null) ? userValue : defaultValue;
Искушение, которое я вижу в людях, чаще всего использует bool?
как флаг с тремя состояниями. Это не имеет смысла, потому что в true / false / ??? нет третьей возможности. Тем, кто читает ваш код, придется копаться в комментариях (в лучшем случае), чтобы узнать, что true означает использование синего текста, false означает красный текст, а null означает зеленый текст. Используйте перечисления для этого.
Это самая большая ловушка, в которую я вижу, что люди попадают - кроме этого, просто привыкайте проверять, являются ли ваши nullables нулевыми - либо путем сравнения с нулем, либо с помощью .HasValue