Логика условий отладки Assert и языковые особенности - PullRequest
1 голос
/ 19 апреля 2011

Я не являюсь носителем английского языка, поэтому для меня немного странен метод Debug.Assert, который для меня проверяет условие, фактически проверяет противоположность этому условию.

Подтвердить = заранее, подтвердить, доказывать, утверждать, утверждать, провозглашать, исповедовать, произносить, выдвигать, говорить, стресс и т. д.

Я ожидаю, что

Debug.Assert(Me.Member Is Nothing, "Member Is Nothing!")

ведет себя как

Affirm(condition, "Message") ' conditional message

Однако на самом деле я должен сделать

Debug.Assert(Me.Member Is Nothing, "Member Is NOT Nothing!")

Affirm(NOT condition, "Message") ' counter-conditional message

Я что-то пропустил?

Вы видите это интуитивно или нет?

Ответы [ 5 ]

3 голосов
/ 19 апреля 2011

У вас правильный синтаксис, но подумайте об этом так

Debug.Assert(Me.Member Is Nothing, "Member assert.")

Это будет утверждать, что Me.Member is Nothing, и будет предупреждать вас только тогда, когда это не так.Вроде как, если бы вы были в споре, и вы сказали: «Земля на 75% состоит из воды».Не так много людей будут спорить с вами об этом.Но если вы сказали «Земля в основном состоит из шоколадного торта».Люди будут спорить.

Так же и с Assert, если утверждение верно, нет необходимости говорить отладчику.Если это неверно, вам нужно сообщить вам.

Кстати, я носитель английского языка, и первые несколько раз, когда я писал заявления об утверждении, я писал их задом наперед:)

1 голос
/ 19 апреля 2011

API для Debug.Assert действительно немного нелогичен. Мне потребовалось много времени, чтобы привыкнуть к этому. В моей голове Assert переводится так:

if (condition)
{
    Fail(message);
}

Но на самом деле оно переведено на:

if (condition)
{
    // Success
}
else
{
    Fail(message);
}

или коротко:

if (!condition)
{
    Fail(message);
}

Хитрость в том, что логическое выражение должно быть истинным , а не , чтобы утверждать. Я думаю, однако, этот дизайн был выбран, потому что этот API был доступен для разработчиков на C ++ в течение долгого времени, и его замена ослепила бы их.

0 голосов
/ 19 апреля 2011

Вы ничего не пропустили. Возможно, дизайнеры должны были назвать метод «IfNot» вместо «Assert». Я полагаю, они не подразумевали, что вызов Assert читается как выражение «если». «Утверждение» в качестве имени метода для проверки значений также имеет длинную историю в C / C ++, поэтому я думаю, что они хотели использовать то же имя в C #.

0 голосов
/ 19 апреля 2011

С Assert вы проверяете логику в своем коде.При желании вы можете добавить сообщение, чтобы помочь с отладкой, если утверждение не выполнено.

int i = 3;
i *= 3;
assert(i == 9, "Strange arithmetic failure");

(Простите за код C ++.)

0 голосов
/ 19 апреля 2011

Дело в том, что ваше предположение о методе Assert немного не соответствует действительности.

Я имею в виду, функция проверяет, действительно ли условие, то есть ИСТИНА.Таким образом, он утверждает, что условие.

ЕСЛИ условие не выполнено, то есть ЛОЖЬ, отображается сообщение.

...