Почему C # не принимает булевы операторы как слова («и», «или», «не» и т. Д.) С текущими операторами? - PullRequest
3 голосов
/ 04 сентября 2010

Мой if stetement:

if (!string.IsNullOrEmpty(Person.Name))
        // some code

Я думаю, что "!"оператор менее читабелен при написании императивного кода,

Вы согласны со мной, следующий код более читабелен?

if (not string.IsNullOrEmpty(Person.Name))
            // some code

Я не говорю о замене текущих операторов, но гдепроблема, если язык принимает их обоих?

Ответы [ 4 ]

11 голосов
/ 04 сентября 2010

Есть несколько веских причин:

  • Есть некоторые тонкости, которые слова не передают слишком хорошо.Например, оператор короткого замыкания И против оператора, который не закорачивается (&& vs &).Недавно VB (ish) представила оператор короткого замыкания AND под названием AndAlso.Это никогда не имело никакого смысла для меня.Кажется, это смущает людей с самого начала.

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

  • Потому что это то, к чему привыкли программисты на C, Java, Objective-C и C ++.Люди используют этот синтаксис уже 40 (?) Лет.Это придает атмосферу преемственности языкам, которые людям, похоже, нравятся.

  • "and", "or" и "not" являются английскими словами, а синтаксис использует такие глифы, как!и && / & более лингвистически и культурно нейтрален.

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

7 голосов
/ 04 сентября 2010

Если вы хотите, чтобы ваш код был более «читабельным», возможно, VB - лучший вариант для вас. Вполне допустимо иметь такие утверждения, как

If value Is Not Null Then
   'do something
End If

Лично я нахожу, что синтаксис c # в! и && и || быть очень читабельным, потому что они согласованы на нескольких языках, а также имеют тенденцию следовать соглашениям, используемым в математике, где эти операции часто получают свое начало.

Это также означает, что в их значении нет двусмысленности, поскольку это символ.

1 голос
/ 04 сентября 2010

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

0 голосов
/ 04 сентября 2010

У меня есть интересная мысль.Часто вы хотите использовать свойства языка.Если у вас есть логическое выражение в нормальной форме, где основным оператором в польском дереве логических операций является AND (&&), а первый операнд равен false, язык не будет вычислять значение других операндов.Точно так же, если основным оператором в польском дереве логических операций является ИЛИ (||), а первый оператор - «истина», остальные операнды вычисляться не будут.Давайте рассмотрим несколько примеров

//...
// Position is a class
private bool checkMate(ref int numberOfPlies, ref ChessPosition position, int maxNumberOfPlies, List<Move> moves)
{
    if (numberOfPlies > maxNumberOfPlies)
        return false;
    position.makeMove(moves[numberOfPlies]);
    if (!(position.getSuccessOfLastMove())))
        return false;
    numberOfPlies++;
    return ((
            ((isCheckMate()) ||
            ((checkMate(ref numberOfPlies, ref position, maxNumberOfPlies, moves)))
           ));
}
//...

Приведенный выше метод проверяет, приводит ли вариация к мату с заданной шахматной позиции, и мат дается в определенном количестве слоев.Position - это класс, его метод makeMove () выполняет перемещение в заданную позицию, его метод getSuccessOfLastMove () имеет значение true, если последний шаг был действительным, и false, если последний шаг был недействительным.Move это другой класс.Ply - это половина хода в шахматах (Move = ходы белых и черных ходов, Ply = ход белых или черных).isCheckMate проверяет, является ли данная позиция матом.

Мы не хотим вызывать checkMate, если isCheckMate () имеет значение true, поэтому нам здесь не нужна другая операция, кроме обычной ||.

Однако здесь мы хотим оценить все операнды:

// ... bool isThisFlowerYellowOrYellowish (Flower flower) {return (((flower.flowerColor == flower.yellow) ИЛИ (flower.FlowerColor == flower.yellowish)) AND (flower.setColorToYellowIfTheColorIsYellowish ()));} //...

Приведенный выше код не является допустимым кодом C #, но давайте посмотрим, почему нам нужно ИЛИ в C #.В приведенном выше примере мы хотим запустить setColorToYellowIfTheCollorIsYellowish (), даже если мы знаем результат полной оценки до оценки функции, но код не работает, потому что у нас нет операции ИЛИ, которая вычисляет все операнды, даже если мымогу знать результат.Если бы это было возможно, мы бы не могли написать функцию альтернативным способом.

//...
bool isThisFlowerYellowOrYellowish(Flower flower)
{
    if (flower.FlowerColor == flower.yellowish)
        return flower.setColorToYellowIfTheColorIsYellowish();
    return (flower.flowerColor == flower.yellow);
}

// ...

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

По моему мнению, нам не нужен оператор "НЕ", потому что это унарный оператор, и он будет похож на!оператор.

По моему мнению, мы не должны изменять!, ||, &&, & и |операторы, потому что все программисты привыкли к ним.Если они будут изменены в C #, язык не будет иметь обратной совместимости.

EDIT:

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

...