Выполнение простых утверждений IF Сокращение

Если мы предположим, что у нас есть этот небольшой фрагмент кода:

string str = "checked";
bool test1;

if (str == "checked")
{
    test1 = true;
}
else
{
    test1 = false;
}

Неправильно ли вам изменить простой оператор следующим образом:

bool test2 = (str == "checked");

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

Следующая тестовая программа:

using System;

public class Test
{

    public static void Main()
    {
        string str = "checked";

        bool test1;

        if (str == "checked")
        {
            test1 = true;
        }
        else
        {
            test1 = false;
        }

        bool test2 = (str == "checked");

        bool test3 = (str != "checked");

        Console.WriteLine(test1.ToString());
        Console.WriteLine(test2.ToString());
        Console.WriteLine(test3.ToString());
    }
}

Выходы:

True
True
False

Любое понимание и т. д. ценится.

6 голосов | спросил Felix Weir 30 Maypm13 2013, 19:08:31

6 ответов


33
  

Неправильно ли вам изменить простой оператор следующим образом:

bool test2 = (str == "checked");

Нет, это хорошая практика. Для меня более длинный код:

if (str == "checked")
{  
    test1 = true;
}
else
{
    test1 = false;
} 

указывает, что программист не понимает булевы выражения. Более короткая форма намного яснее. Точно так же не пишите:

if (boolean-expression) {
    return true;
} else {
    return false;
}

Просто напишите return boolean-expression;

ответил kevin cline 30 Maypm13 2013, 19:16:29
12

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

Он намекает, что тот, кто его написал, либо не понимает логические типы данных, либо не реализует == не зависит от if

ответил Izkata 30 Maypm13 2013, 19:13:16
6

В то время как более короткая форма более элегантна и компактна, есть преимущество в длинной форме: вы можете легко установить точку останова в test1 = true , в то время как вы не можете с более короткой формой.

ответил Jonathan 31 Mayam13 2013, 01:55:00
2

Кто увидит ваш код?

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

Пример:
На предыдущей работе у меня были сотрудники, которые требовали полной логики. Когда они пытались использовать однострочные линии, они получали логику назад на регулярной основе. Где я сейчас, компания наполнена умными людьми, которые очень редко (если когда-либо) совершают эту ошибку. Здесь мы вставляем тройные выражения if без путаницы.

ответил Richard 30 Maypm13 2013, 20:16:49
2

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

bool test2 = (str == "checked");

было бы достаточно, и он определенно производит меньше строк IL. В моем эксперименте с Mono я обнаружил однострочное заявление:

IL_0000: ldstr "test"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldstr "test"
IL_000c: call bool [mscorlib]System.String::op_Equality(string, string)
IL_0011: stloc.1
IL_0012: ldloc.1

В то время как было создано традиционное выражение if-else:

IL_0000: ldstr "test2"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldstr "test2"
IL_000c: call bool [mscorlib]System.String::op_Equality(string, string)
IL_0011: brfalse IL_001d

IL_0016: ldc.i4.1
IL_0017: stloc.1
IL_0018: br IL_001f

IL_001d: ldc.i4.0
IL_001e: stloc.1

IL_001f: ldloc.1
IL_0020: ret
IL_0013: ret

Похоже, что в моем случае компилятор Mono создал несколько подпрограмм и управляет стеком вызовов, чтобы обрабатывать if-else.

Говоря это, если ваша логическая операция становится более сложной, то для удобства чтения в профессиональной среде разработки я бы по крайней мере изменил ее на:

if (/*complex boolean operation*/)
    // set state in case of true evaluation
else
    // set state in case of false evaluation

Без дальнейшего контекста я не могу предоставить вам лучшее решение.

ответил nathandelane 30 Maypm13 2013, 20:28:16
-4

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

ответил ckb 31 Mayam13 2013, 02:10:34

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132