C#: Должен значение по умолчанию перечисления не быть Ни одним или Неизвестный?

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

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

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

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

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

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

9
задан bwerks 1 July 2010 в 17:56
поделиться

8 ответов

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

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

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

4
ответ дан 4 December 2019 в 06:40
поделиться

То же самое со всеми ответами «Я бы не стал этого делать», но если вы настаиваете, вот мои 0,02 доллара.

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

public ErrorCode? DoFoo()

Теперь вы можете проверить наличие NULL

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

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

0
ответ дан 4 December 2019 в 06:40
поделиться

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

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

0
ответ дан 4 December 2019 в 06:40
поделиться

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

15
ответ дан 4 December 2019 в 06:40
поделиться

Думаю, я не согласен со всеми по этому поводу.

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

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

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

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

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

4
ответ дан 4 December 2019 в 06:40
поделиться

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

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

if (errorCode != Success)

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

if (errorCode != 0)

. Итак, вот оно. Ваш Успешный код равен 0, у вас нет кода Нет, а Неизвестным может быть все, что вы хотите.

3
ответ дан 4 December 2019 в 06:40
поделиться

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

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

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

UPDATE

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

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

2
ответ дан 4 December 2019 в 06:40
поделиться

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

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

6
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

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