ppxy
@ppxy

Можно ли избежать принудительного возврата false в C#?

Есть код:
private Dictionary<int, bool> keyboard = new Dictionary<int, bool>();

//...skipped

 public bool Func(int k)
        {
            if (keyboard.ContainsKey(k))
            {
                return keyboard[k];
            }

            return false;
        }


Вопрос следующий. По стандарту (может быть не по стандарту, поправьте меня) если в методе есть if, то мы должны вернуть значения из все возможных мест. В данном куске кода можно было бы обойтись без return false;. Но возникает ошибка. Как думаете, возможно-ли перехитрить C#?
  • Вопрос задан
  • 2232 просмотра
Решения вопроса 1
@Sumor
В C# функция во всех возможных путях выполнения должна либо возвратить какое-либо значение возвращаемого типа, либо вызвать исключение.
В вашем случае я вижу три варианта:
1. Оставить всё как есть. Удобно, если нужно в случае отсутствия ключа возвращать значение по-умолчанию.
2. Возвращать вместо bool объект типа Nullable (короткая запись bool?). В этом случае последний оператор будет return null. И вызывающие эту функцию будут знать, что либо возвратится значение, либо, если ключ не найден, — null.
3. Вызывать исключение. Например, throw new ArgumentOutOfRangeException("Ключ не найден");
В таком случае вызывающие должны уметь обрабатывать ситуацию, когда вызовется исключение.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@WhoMe
Вы что-то путаете, наверное имеется ввиду не if, а само ветвление.
Если у метода определено возвращаемое значение - в данном случае bool - то оно должно быть возвращено(либо брошено исключение).
Каждый участок в коде на котором завершеается выполнение метода (терминальная ветвь) должен возвращать значение (за исключением случая, когда возвращаемое значение отсутствует, т.е void), либо кидать Exception.

Рассмотрим код:
public bool Func(int k)
        {
            if (keyboard.ContainsKey(k))
            {
                return keyboard[k];
            }

           // убираем return false;
        }

// ... и где-нибудь вызываем
bool val = obj.Func(1);


Допустим ключа 1 не нашлось в keyboard, что в таком случае по вашему должно оказаться в val?
Возникает неопределенность. Поведение программы становиться непредсказуемым. Одна из целей ЯП выского уровня как раз в предотвращении таких ситуаций.
Т.е перехитрить C# нельзя. По крайней мере не в исходном коде.

Принудительный возврат сделан специально, чтобы снизить вероятность ошибки. Терминальную ветвь не всегда легко увидеть на глаз. А еще устраняет неопределенность: то ли ты забыл поставить возврат (ошибся), то ли так и задумывалось.
Ответ написан
Комментировать
Neuroware
@Neuroware
Программист в свободное от работы время
по моему если возникает подобный вопрос тут проблема скорее с алгоритмом, зачем нужно создавать отдельную фунцию, которая вызывает 1 строчку кода, просто вместо вызова функции сразу проверяй то что нужно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы