true- och false-operatorer – behandla dina objekt som ett booleskt värde
Operatorn true
returnerar bool-värdet true
för att indikera att dess operand definitivt är sann, medan operatorn false
returnerar bool
värdet true
för att indikera att dess operand definitivt är falsk.
Observera att en typ som implementerar både true
och false
operatorer måste följa dessa semantik:
- "Är det här objektet sant?" matchar operatorn
true
. Operatorntrue
returnerartrue
om objektet ärtrue
. Svaret är "Ja, det här objektet är sant". - "Är det här objektet falskt?" matchar operatorn
false
. Operatornfalse
returnerartrue
om objektet ärfalse
. Svaret är "Ja, det här objektet är falskt"
Operatorerna true
och false
är inte garanterade att komplettera varandra. Det innebär att både operatorn true
och false
kan returnera bool
värdet false
för samma operand. Om en typ definierar en av dessa två operatorer måste den också definiera den andra operatorn.
Dricks
Använd typen bool?
om du behöver stöd för logik med tre värden (till exempel när du arbetar med databaser som stöder en boolesk typ med tre värden). C# tillhandahåller operatorerna &
och |
som stöder trevärdeslogik med bool?
operanderna. Mer information finns i avsnittet Booleska logiska operatorer som kan ogiltigförklaras i artikeln Booleska logiska operatorer .
Booleska uttryck
En typ med den definierade true
operatorn kan vara typen av ett resultat av ett kontrollerande villkorsuttryck i if, do, while och for statements och i villkorsoperatorn ?:
. Mer information finns i avsnittet Booleska uttryck i C#-språkspecifikationen.
Användardefinierade villkorsstyrda logiska operatorer
Om en typ med de definierade operatorerna och false
operatorerna överbelastar den logiska OR-operatorn |
eller den logiska AND-operatorn &
på ett visst sätt, kan den villkorliga logiska OR-operatorn ||
respektive den villkorsstyrda logiska AND-operatorn &&
utvärderas för operanderna av den typen.true
Mer information finns i avsnittet Användardefinierade villkorsstyrda logiska operatorer i C#-språkspecifikationen.
Exempel
I följande exempel visas den typ som definierar både true
operatorer och false
operatorer. Typen överbelastar också den logiska AND-operatorn &
på ett sådant sätt att operatorn &&
också kan utvärderas för operanderna av den typen.
public struct LaunchStatus
{
public static readonly LaunchStatus Green = new LaunchStatus(0);
public static readonly LaunchStatus Yellow = new LaunchStatus(1);
public static readonly LaunchStatus Red = new LaunchStatus(2);
private int status;
private LaunchStatus(int status)
{
this.status = status;
}
public static bool operator true(LaunchStatus x) => x == Green || x == Yellow;
public static bool operator false(LaunchStatus x) => x == Red;
public static LaunchStatus operator &(LaunchStatus x, LaunchStatus y)
{
if (x == Red || y == Red || (x == Yellow && y == Yellow))
{
return Red;
}
if (x == Yellow || y == Yellow)
{
return Yellow;
}
return Green;
}
public static bool operator ==(LaunchStatus x, LaunchStatus y) => x.status == y.status;
public static bool operator !=(LaunchStatus x, LaunchStatus y) => !(x == y);
public override bool Equals(object obj) => obj is LaunchStatus other && this == other;
public override int GetHashCode() => status;
}
public class LaunchStatusTest
{
public static void Main()
{
LaunchStatus okToLaunch = GetFuelLaunchStatus() && GetNavigationLaunchStatus();
Console.WriteLine(okToLaunch ? "Ready to go!" : "Wait!");
}
static LaunchStatus GetFuelLaunchStatus()
{
Console.WriteLine("Getting fuel launch status...");
return LaunchStatus.Red;
}
static LaunchStatus GetNavigationLaunchStatus()
{
Console.WriteLine("Getting navigation launch status...");
return LaunchStatus.Yellow;
}
}
Observera operatorns kortslutningsbeteende &&
. GetFuelLaunchStatus
När metoden returnerar LaunchStatus.Red
utvärderas inte operatorns &&
högra operande. Det beror på att LaunchStatus.Red
är definitivt falskt. Resultatet av det logiska AND-värdet beror inte på värdet för den högra operanden. Resultatet av exemplet är följande:
Getting fuel launch status...
Wait!