C #: должно ли значение по умолчанию для перечисления быть None или Unknown? - PullRequest
9 голосов
/ 01 июля 2010

Скажем, у вас есть enum, представляющий код ошибки.Будет несколько кодов, каждый со своим собственным значением int;однако значение enum, которое получает значение по умолчанию 0, похоже, должно быть тщательно продумано.

В случае перечисления кода ошибки есть два специальных значения, о которых я могу думать: Нет (для случаев, когдаошибки нет) и Неизвестно (для случаев, когда существующий код ошибки не подходит или, возможно, даже когда состояние ошибки не может быть обнаружено).

Похоже, что одно из этих значений должно получить 0, тогда как другое будетвероятно, получить что-то еще, как -1.Более уместно установить значение None на 0 или значение Unknown на 0?

public enum ErrorCode
{
    None = -1,
    Unknown = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
}

public enum ErrorCode
{
    Unknown = -1,
    None = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
}

Мой инстинкт подсказывает мне, что по умолчанию должно быть Unknown, но мне любопытно, если кто-то сделал это по-другому.

Ответы [ 9 ]

15 голосов
/ 01 июля 2010

Поскольку вы помечаете свой вопрос передовым опытом: не используйте коды ошибок, когда вы можете использовать исключения.

6 голосов
/ 01 июля 2010

По моему мнению, оба значения Unknown или None означают одно и то же в контексте перечисления ErrorCode.Я считаю, что если я проверяю код ошибки, то это потому, что у меня уже есть ошибка.

Я также считаю, что перечисление кода ошибки полезно только в пользовательском исключении или в качестве пользовательских данных.существующего типа исключения и в обоих сценариях у вас всегда будет ошибка.

4 голосов
/ 01 июля 2010

Полагаю, я не соглашусь со всеми остальными в этом.

Нет ничего плохого в кодах ошибок при использовании в смысле " каково текущее состояние этой функции. "

Чтобы создать пример: если у вас есть дополнительная сетевая временная папка, к которой вы хотите получить доступ, и вы хотите отобразить результаты за последний раз, когда вы пытались получить к ней доступ, вы бы сохранили еев коде ошибки.Возможно, в строке состояния вы хотите показать текущее состояние пользователю.

Для меня я бы использовал None как 0, по умолчанию.Я не вижу причин, чтобы сделать Неизвестное отрицательным.Неизвестный - это совершенно нормальное состояние ошибки.Вы можете просто поставить его в конец списка.На практике я сделал

public enum ErrorCode
{
    None = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
    Unknown,
}

И чтобы ответить на ваш вопрос, я скажу Ни один не должен быть значением по умолчанию .None означает: не существует ошибки, о которой вы знаете.Неизвестное будет означать для меня: существует ошибка, которая настолько неясна, что вы не можете учесть это в своем коде.

4 голосов
/ 01 июля 2010

Определенно не очень хорошая практика.Но если нет другого пути ... тогда я обычно выбираю второй вариант:

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

0 хорошо согласуется с соглашением «Нет ошибок», а -1 - с пониманиемкакая-то ошибка (которая может быть неизвестна).

3 голосов
/ 01 июля 2010

Прежде всего, у вас не должно быть кода ошибки None. Вместо этого назовите это «Успех».

Теперь подумайте, как вы собираетесь проверить код ошибки. Большинство людей ожидают что-то вроде этого:

if (errorCode != Success)

или они используют сокращение

if (errorCode != 0)

Итак, вот оно. Ваш код успеха равен 0, у вас нет кода None, и Unknown может быть любым, что вы захотите.

2 голосов
/ 01 июля 2010

Зачем вообще возвращать значение ErrorCode, если ошибки нет?

Не имеет большого смысла. Удаление этого решит вашу проблему. Вы можете просто сделать 0 для Unkown:

public enum ErrorCode
{
    Unkown = 0,
    InsufficientPermissions,
    ConnectivityError
}

UPDATE

Ваш комментарий немного страшен. Вы никогда не должны иметь метод, который возвращает тип ErrorCode. Это очень плохая практика. Так как ErrorCodes должны возвращаться только в исключительных обстоятельствах, рекомендуется генерировать исключения.

При желании в вашем пользовательском исключении может быть поле, содержащее значение ErrorCode.

1 голос
/ 12 апреля 2013

Я бы на самом деле не согласился с тем, кто говорит, что вы должны использовать только исключения. При использовании любого вида приложения, которое использует базу данных, вы можете сохранить статусы для данных в системе. Будь то коды ошибок или какой-то статус, они лучше всего представлены в базе данных как целые числа.

Использование и обработка исключений - очень важный навык, и его следует использовать, но я считаю, что наличие кода ошибки вместе с этими исключениями, как правило, хорошая идея. Он не требует слишком много дополнительных ресурсов и пригоден для использования в приложении, связанном с базой данных.

Я бы на самом деле предложил изменить «Нет» на «Успех», как это было предложено, но вы установите «Успех» в значение 1, и все остальные ошибки будут увеличиваться оттуда. Причиной этого является то, что в качестве стандартного в большинстве приложений баз данных столбцы состояния не обнуляются и обычно отслеживаются как целые числа. Это может привести к проблемам, если вы используете статус успеха 0, потому что по умолчанию столбцы целых чисел, не допускающие значения NULL, будут установлены в 0, если пользователь явно не вставит что-то еще. Это может привести к ложному статусу / коду ошибки и вызвать проблемы в будущем вашего приложения. Мало того, что целочисленные переменные автоматически устанавливаются в 0 по умолчанию в C #, что приводит к автоматическому успеху, так и в перечислениях, если вы не устанавливаете начальное значение, а это не то, что вам нужно.

Кроме того, с точки зрения кодирования 1 также может означать true, и, следовательно, оно проходит успешно. Есть ситуации, когда это может быть не так. В системах на основе Unix возврат 0 означает успех / отсутствие ошибок, а в других языках, таких как c ++, возврат 0 является стандартным для основной функции, что также указывает на успешное выполнение основной функции.

0 голосов
/ 01 июля 2010

То же самое относится ко всем ответам "Я не буду делать это", но если вы настаиваете, вот мои $ 0,02.

ErrorCodes.None не имеет смысла, так как ошибки нет.ErrorCodes.Unknown не полезно.Попробуйте вернуть обнуляемый код ошибки:

public ErrorCode? DoFoo()

Теперь вы можете проверить на null

var error = DoFoo();
if (error != null)
    // react

Все еще плохо, но, по крайней мере, это позволяет , а не вернутькод ошибки, если нет ошибки.

0 голосов
/ 01 июля 2010

ErrorCodes плохо.Исключения хорошие.Но чтобы ответить на вопрос в виде вопроса:

Если ваше перечисление имеет значение "Неизвестно", оно должно быть значением по умолчанию.

...