Операторы C# и удобочитаемость

Это более общее, чем специфическое для git, но я видел много проектов с сообщениями коммитов типа «bugfix», «fix foo» или «stuff». Не делайте этого, вместо этого используйте осмысленные коммит-сообщения, такие как «component fiz: Fix foo bug [\ n \ nExtra info]» и «Очистка пробелов». Вы будете благодарить себя, когда позже неизбежно посмотрите на свою историю коммитов, и вам не нужно будет говорить «Что, черт возьми, я имел в виду, когда совершал« вещи »?»

5
задан Leroy Jenkins 23 October 2009 в 20:48
поделиться

10 ответов

Проблема в том, что если работает с логическими значениями.

stringName == "firstName" возвращает логическое значение.
«lastName» является строковым литералом.

|| - это сокращенный логический оператор или оператор, который принимает логические значения с обеих сторон.

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

Теоретически, синтаксический анализатор может сделать вывод о том, что вы имеете в виду ... но это очень быстро становится неоднозначным.

if (stringName == firstName || lastName)

Выглядит нормально, правда? Но что такое lastName?

Что, если бы я сделал это?

const bool lastName = false;

Кроме того, && является противоположностью || , но stringName == firstName && lastName не противоречит приведенной выше логике и на самом деле не имеет смысла.

10
ответ дан 18 December 2019 в 05:33
поделиться

Догадывать компилятор о намерениях программиста, когда код явно неправильный, чтобы исправить это, - действительно, очень плохая идея.

6
ответ дан 18 December 2019 в 05:33
поделиться

Думаю, ваше предложение запутает правила синтаксического анализа выражений - теперь '==' становится оператором квадрени (?), А не двоичным. Я обнаружил, что мне не хватает оператора IN SQL, и я использовал что-то вроде этого:

if (stringName.In("foo", "bar", "baz"))
{

}

// in an extension method class
public static bool In<T>(this T value, params T[] values)
{
    return values.Contains(value);
}
11
ответ дан 18 December 2019 в 05:33
поделиться

Даже в круглых скобках это не имеет смысла. stringName == ("firstName" || "lastName") похоже, что вы хотите проверить истинность двух строк, и эти строки всегда будут истинными, а затем сравните этот логический результат с string stringName .

Если вы добавите круглые скобки вроде этого (stringName == "firstName") || "lastName" , условие также всегда будет истинным, поскольку "lastName" всегда истинно независимо от того, равно ли stringName "firstName" .

Мне нравится способ Ruby:

["firstName", "lastName"].include? stringName

Вы всегда можете использовать Contains , как предлагали другие, или написать метод расширения String, где вы могли бы это сделать:

stringName.EqualsOneOf(new[] {"firstName", "lastName"})
2
ответ дан 18 December 2019 в 05:33
поделиться

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

Тем более, что вы уже можете сделать что-то вроде:

if(new string[]{"firstName","lastName"}.Contains(stringName))
    // code
1
ответ дан 18 December 2019 в 05:33
поделиться

Я считаю, что функция Contains () решает эту проблему, например:

string[] ValidNames = new string[] { "firstName", "lastName"};

if(ValidNames.Contains(stringName))
{
    //Do Code
}
1
ответ дан 18 December 2019 в 05:33
поделиться

Вот почему я всегда делаю это по привычке:

if ((stringName == "firstName") || (stringName == "lastName"))
   // Do code

Через некоторое время это становится моей второй натурой.

0
ответ дан 18 December 2019 в 05:33
поделиться

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

С другой стороны, круглые скобки могут решить эту проблему.

1
ответ дан 18 December 2019 в 05:33
поделиться

Когда FCL содержит все возможности для создания огромного разнообразия ответов, представленных в этом потоке, вам не нужно иметь более гибкий синтаксис C #, потому что удобочитаемость скоро станет особенностью того, как вы создаете ответ среди всего богатства. Большую часть времени он сводится к выбору между вызовами метода и объекта.

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

        bool found = Array.Exists(
            // array of strings to search
            new[] { "c#", ".net", "programming", "design patterns", "work", "play", "bits", "bytes", "break" },
            // criteria - can even satisfy multiple conditions simultaneously if desired
            str => (str == ".NET" || str == "work") //look for ".NET" or "work"
            );
0
ответ дан 18 December 2019 в 05:33
поделиться

Я бы не возражал против синтаксиса типа SQL:

if(stringName in ("firsName", "lastName"))
{
}
1
ответ дан 18 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

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