2010-12-29 13 views
0

stieß ich auf einige Code, der wie folgt aussieht:Was macht das "& =" in diesem C# -Code?

string someString; 

... 

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

Warum sollte ich das bitweise Operator anstelle von „=“ verwenden?

+0

Ich halte diesen Code eher hässlich. Es ist kürzer, aber es scheint mir ein bisschen missbräuchlich zu sein, ein bitweises zu verwenden und wenn Sie wirklich eine logische und. Beachten Sie auch, dass logisch und unterstützt Kurzschlüsse und damit vermeidet die Notwendigkeit zu berechnen 'someString.ToUpperInvariant(). Entspricht ("blah"); 'wenn' SomeBoolean' ist "wahr". – Brian

+1

@Brian: Es ist kein bitweiser Operator, wenn er auf boolesche Werte angewendet wird. – Guffa

+0

@Guffa: Ja, du hast Recht. [Das MSDN] (http://msdn.microsoft.com/en-us/library/sbf85k1c.aspx) gibt das explizit explizit an. Ich würde annehmen, dass der Standard das auch tut. – Brian

Antwort

6

Es ist kein Bit-Operator, wenn es um Boolesche Operatoren angewendet wird.

Es ist das gleiche wie:

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

Sie sehen in der Regel die Abkürzung und Betreiber &&, sondern der Betreiber & ist auch ein und Bediener, wenn auf booleans angewendet wird, nur, dass es nicht die kurz- tun Schnittbit.

Sie können stattdessen den Operator && verwenden (aber es gibt keinen Operator &&=), um möglicherweise einige Berechnungen zu speichern. Wenn die someBooleanfalse enthält, wird der zweite Operand nicht ausgewertet werden:

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

In Ihrem speziellen Fall wird die Variable auf true auf der Linie setzen, bevor, so dass der Betrieb und ist vollständig unneccesary. Sie können den Ausdruck einfach auswerten und der Variablen zuweisen. Auch anstelle der Zeichenfolge zu konvertieren und dann zu vergleichen, sollten Sie einen Vergleich verwenden, die die Art und Weise behandelt Sie wollen, dass es im Vergleich:

bool someBoolean = 
    "blah".Equals(someString, StringComparison.InvariantCultureIgnoreCase); 
+4

Bitweise Operatoren sind immer noch bitweise Operatoren, wenn sie auf System.Booleans angewendet werden. Da jedoch C# 'wahr' gleich 1 setzt, werden sie mit der gleichen Wahrheitstabelle wie die booleschen Operatoren behandelt. Jede Ganzzahl ungleich Null kann jedoch als gültiger wahrer Wert dienen. Ein Beispiel finden Sie unter http://dotnetpad.net/ViewPaste/6wYCZ3QmNUClKXiYi113Pw. – Gobiner

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

, die, in diesem Fall vor someBoolean wahr ist, bedeutet

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

Es entspricht += für die & Anbieters.

1

Es ist die Abkürzung für:

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

Siehe MSDN (& = Operator).

1

Es ist die Kurzform von dieser:

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

Wie Guffa zeigte, gibt es einen Unterschied zwischen & und & &. Ich würde nicht sagen, dass Sie können, aber Sie sollten & & anstelle von & verwenden: & macht Ihren Code Geeker, aber & & macht Ihren Code lesbarer ... und leistungsfähiger. Das folgende zeigt, wie:

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; 
    } 
}