Что делает "& =" в этом коде C #? - PullRequest
7 голосов
/ 29 декабря 2010

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

string someString;

...

bool someBoolean = true;
someBoolean &= someString.ToUpperInvariant().Equals("blah");

Зачем мне использовать битовый оператор вместо "="?

Ответы [ 6 ]

18 голосов
/ 29 декабря 2010

Это не побитовый оператор, когда он применяется к логическим операторам.

Это то же самое, что:

someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah");

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

Вместо этого можно использовать оператор && (но оператора &&= нет) возможно сэкономить на некоторых расчетах.Если someBoolean содержит false, второй операнд не будет вычисляться:

someBoolean = someBoolean && someString.ToUpperInvariant().Equals("blah");

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

bool someBoolean =
  "blah".Equals(someString, StringComparison.InvariantCultureIgnoreCase);
3 голосов
/ 29 декабря 2010

Это эквивалент += для оператора &.

2 голосов
/ 29 декабря 2010

Это сокращенно от:

someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah");

См. MSDN (& = оператор).

2 голосов
/ 29 декабря 2010
someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah");

, что, в данном случае, до истины someBoolean, означает

someBoolean = someString.ToUpperInvariant().Equals("blah");
1 голос
/ 07 марта 2011

Как указал Гуффа, есть разница между & и &&.Я бы не сказал, что вы можете, но скорее вы ДОЛЖНЫ использовать && вместо &: &, чтобы сделать ваш код гиков, но && сделает ваш код более читабельным ... и более производительным.Ниже показано, как:

class Program
{
    static void Main(string[] args)
    {
        Stopwatch Chrono = Stopwatch.StartNew();
        if (false & Verifier())
            Console.WriteLine("OK");
        Chrono.Stop();
        Console.WriteLine(Chrono.Elapsed);

        Chrono.Restart();
        if (false && Verifier())
            Console.WriteLine("OK");
        Chrono.Stop();
        Console.WriteLine(Chrono.Elapsed);
    }

    public static bool Verifier()
    {
        // Long test
        Thread.Sleep(2000);
        return true;
    }
}
1 голос
/ 29 декабря 2010

Это краткая форма:

someBoolean = someBoolean & someString.ToUpperInvariant().Equals("blah")
...