2010-12-29 6 views
0

je suis tombé sur un code qui ressemble à ceci:Que fait le "& =" dans ce code C#?

string someString; 

... 

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

Pourquoi devrais-je utiliser l'opérateur de la place au niveau du bit « = »?

+0

Je considère que le code plutôt moche. C'est plus court, mais ça me semble un peu abusif d'utiliser un bit et quand vous voulez vraiment dire logique et. Notez également que logique et supporte le court-circuit et évite ainsi le besoin de calculer 'someString.ToUpperInvariant(). Equals (" blah ");' quand 'someBoolean' est' true'. – Brian

+1

@Brian: Ce n'est pas un opérateur au niveau du bit lorsqu'il est appliqué aux booléens. – Guffa

+0

@Guffa: Oui, vous avez raison. [Le MSDN] (http://msdn.microsoft.com/en-us/library/sbf85k1c.aspx) indique réellement cela explicitement. Je suppose que la norme fait aussi bien. – Brian

Répondre

6

Ce n'est pas un opérateur de bits lorsqu'il est appliqué aux opérateurs booléens.

Il est le même que:

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

Vous voyez habituellement le raccourci et l'opérateur &&, mais l'opérateur & est également un opérateur et lorsqu'il est appliqué à booléens, seulement il ne fait pas le court couper le bit.

Vous pouvez utiliser l'opérateur && à la place (mais il n'y a pas d'opérateur &&=) pour éventuellement économiser sur certains calculs. Si le someBoolean contient false, le second opérande ne sera pas évaluée:

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

Dans votre cas particulier, la variable est définie à true sur la ligne avant, de sorte que le fonctionnement et est complètement unneccesary. Vous pouvez simplement évaluer l'expression et l'affecter à la variable. En outre, au lieu de convertir la chaîne, puis comparer, vous devez utiliser une comparaison qui gère la façon dont vous voulez comparé:

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

Les opérateurs au niveau du bit sont toujours des opérateurs au niveau du bit lorsqu'ils sont appliqués à System.Booleans. Cependant, puisque C# définit 'vrai' égal à 1, ils finissent par avoir la même table de vérité que les opérateurs booléens. Cependant, tout entier différent de zéro peut servir de valeur vraie valide. Voir http://dotnetpad.net/ViewPaste/6wYCZ3QmNUClKXiYi113Pw pour un exemple. – Gobiner

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

qui, dans ce cas, avant someBoolean est vrai, signifie

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

Il est l'équivalent de += pour l'opérateur &.

1

Il est l'abréviation de:

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

Voir MSDN (& = opérateur).

1

Il est la forme courte de ceci:

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

Comme Guffa a, il y a une différence entre & et & &. Je ne dirais pas que vous pouvez, mais vous devez utiliser & & au lieu de &: & fait votre code Geeker, mais & & rend votre code plus lisible ... et plus performant. Ce qui suit montre comment:

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