Ich bin immer wieder überrascht, dass es mir auch nach all der Zeit, in der ich C # verwendet habe, gelingt, Dinge zu finden, von denen ich nichts wusste ...
Ich habe versucht, im Internet danach zu suchen, aber die Verwendung des "~" in einer Suche funktioniert bei mir nicht so gut und ich habe auch nichts auf MSDN gefunden (um nicht zu sagen, dass es nicht da ist).
Ich habe diesen Codeausschnitt kürzlich gesehen. Was bedeutet die Tilde (~)?
/// <summary>
/// Enumerates the ways a customer may purchase goods.
/// </summary>
[Flags]
public enum PurchaseMethod
{
All = ~0,
None = 0,
Cash = 1,
Check = 2,
CreditCard = 4
}
Ich war ein wenig überrascht, es zu sehen, also habe ich versucht, es zu kompilieren, und es hat funktioniert ... aber ich weiß immer noch nicht, was es bedeutet / tut. Irgendeine Hilfe??
c#
enums
language-features
enumeration
Hugoware
quelle
quelle
Antworten:
~ ist der unäre Komplementoperator - er dreht die Bits seines Operanden um.
in Zweierkomplementarithmetik,
~x == -x-1
Der Operator ~ kann in nahezu jeder Sprache gefunden werden, die Syntax von C entlehnt hat, einschließlich Objective-C / C ++ / C # / Java / Javascript.
quelle
Ich würde das denken:
Wäre etwas klarer.
quelle
Aufgrund von zwei Komplementen in C # ist
~0 == -1
die Zahl, bei der alle Bits in der Binärdarstellung 1 sind.quelle
Es ist besser als das
Lösung, denn wenn Sie später eine andere Methode hinzufügen, sagen Sie:
Sie sind bereits mit der Tilde-All fertig, müssen aber die All-Line mit der anderen ändern. So ist es später weniger fehleranfällig.
Grüße
quelle
Nur eine Randnotiz, wenn Sie verwenden
Sie haben den zusätzlichen Vorteil, dass ein anderer Wert (-1)
Cash | Check | CreditCard
bewertetAll
wird, der nicht allen gleich ist, während alle Werte enthalten sind. Wenn Sie beispielsweise drei Kontrollkästchen in der Benutzeroberfläche verwendenund summieren Sie ihre Werte, und der Benutzer wählt sie alle aus, die Sie
All
in der resultierenden Aufzählung sehen würden.quelle
myEnum.HasFlag()
stattdessen: DAll.HasFlag(Cash | Check | CreditCard)
und das würde sich als wahr herausstellen. Wäre eine Problemumgehung, da==
dies nicht immer mit ~ 0 funktioniert.ToString
- nicht über die Verwendung== All
.Für andere, die diese Frage aufschlussreich fanden, habe ich ein kurzes
~
Beispiel. Der folgende Ausschnitt aus der Implementierung einer Malmethode, wie in dieser Mono-Dokumentation beschrieben , wird~
mit großer Wirkung verwendet:Ohne den
~
Operator würde der Code wahrscheinlich ungefähr so aussehen:... weil die Aufzählung so aussieht:
Beachten Sie die Ähnlichkeit dieser Aufzählung mit der Antwort von Sean Bright?
Ich denke, das Wichtigste für mich ist, dass
~
es sich bei einer Aufzählung um denselben Operator handelt wie in einer normalen Codezeile.quelle
&
s in Ihrem zweiten Codeblock nicht s sein|
?Es ist ein Komplementoperator. Hier ist ein Artikel, auf den ich mich oft für bitweise Operatoren beziehe
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
Auch msdn verwendet es in ihrem Enums-Artikel, der zeigt, dass es besser verwendet wird
http://msdn.microsoft.com/en-us/library/cc138362.aspx
quelle
Die Alternative, die ich persönlich benutze und die das Gleiche tut wie die Antwort von @Sean Bright, aber für mich besser aussieht, ist folgende:
Beachten Sie, wie die binäre Natur dieser Zahlen, die alle Zweierpotenzen sind, die folgende Behauptung wahr macht :
(a + b + c) == (a | b | c)
. Und meiner Meinung nach+
sieht es besser aus.quelle
Ich habe einige Experimente mit dem ~ durchgeführt und festgestellt, dass es Fallstricke haben könnte. Betrachten Sie dieses Snippet für LINQPad, das zeigt, dass sich der Wert All enum nicht wie erwartet verhält, wenn alle Werte zusammen angeordnet sind.
quelle
Wenn Sie nur die Aufzählung [Flags] verwenden möchten, ist es möglicherweise bequemer, den bitweisen Linksverschiebungsoperator wie folgt zu verwenden:
quelle