operadores verdadeiro e falso - trate seus objetos como um valor booleano
O operador true
retorna o bool valor true
para indicar que seu operando é definitivamente verdadeiro, enquanto o operador false
retorna o bool
valor true
para indicar que seu operando é definitivamente falso.
Observe que um tipo que implementa os operadores true
e false
deve seguir essa semântica:
- “Esse objeto é verdadeiro?” resolve para a operadora
true
. Operadortrue
retornatrue
se o objeto fortrue
. A resposta é “Sim, esse objeto é verdadeiro”. - “Esse objeto é falso?” resolve para a operadora
false
. Operadorfalse
retornatrue
se o objeto forfalse
. A resposta é "Sim, esse objeto é falso"
Não é garantido que os operadores true
e false
se complementem. Ou seja, ambos os operadores true
e false
podem retornar o valor bool
false
para o mesmo operando. Se um tipo definir um desses dois operadores, ele também deverá definir o outro operador.
Dica
Use o tipo bool?
se você precisar oferecer suporte à lógica de três valores (por exemplo, ao trabalhar com bancos de dados que dão suporte a um tipo booleano de três valores). C# fornece os operadores &
e |
que suportam a lógica de três valores com os operandos bool?
. Para obter mais informações, confira a seção Operadores lógicos booleanos anuláveis do artigo Operadores lógicos boolianos.
Expressões boolianas
Um tipo com o operador true
definido pode ser o tipo de resultado de uma expressão condicional de controle nas instruções if, do, while e for e no operador condicional ?:
. Para saber mais, confira a seção Expressões boolianas da Especificação da linguagem C#.
Operadores lógicos condicionais definidos pelo usuário
Se um tipo com os true
operadoresfalse
definidos sobrecarregar o operador OR lógico |
ou o operador AND lógico &
de uma certa maneira, o operador OR lógico condicional ||
ou operador AND lógico condicional &&
, respectivamente, poderá ser avaliado para os operandos desse tipo. Para obter mais informações, veja a seção Operadores lógicos condicionais definidos pelo usuário na especificação da linguagem C#.
Exemplo
O exemplo a seguir apresenta o tipo que define os dois operadores, true
e false
. O tipo também sobrecarrega o operador AND lógico &
de uma forma que o operador &&
também possa ser avaliado para os operandos desse tipo.
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;
}
}
Observe o comportamento de curto-circuito do operador &&
. Quando o método GetFuelLaunchStatus
retorna LaunchStatus.Red
, o operando à direita do operador &&
não é avaliado. Isso ocorre porque LaunchStatus.Red
é, definitivamente, false. Depois, o resultado do AND lógico não depende do valor do operando à direita. A saída do exemplo é a seguinte:
Getting fuel launch status...
Wait!