Operatore || (Riferimenti per C#)
L'operatore OR condizionale (||) esegue un oggetto OR logico dei propri operandi bool. Se il primo operando valuta a true, il secondo operando non viene valutato. Se il primo operando valuta a false, il secondo operatore OR determina se l'espressione viene valutato rispetto a true o a false.
Note
L'operazione
x || y
corrisponde all'operazione
x | y
ma se x è true, y non viene valutato perché l'operazione OR è true indipendentemente dal valore y. Questo concetto è noto come “valutazione di valutazione short circuit„.
L'operatore OR condizionale non può essere sottoposta a overload, ma gli overload degli operatori logici normali e operatori false e true, con alcune restrizioni, vengono considerati overload degli operatori logici condizionali.
Esempio
Negli esempi seguenti, l'espressione che utilizza || restituisce solo il primo operando. l'espressione che utilizza |valuta entrambi gli operandi. Nel secondo esempio, si verifica un'eccezione di runtime se entrambi gli operandi sono valutati.
class ConditionalOr
{
// Method1 returns true.
static bool Method1()
{
Console.WriteLine("Method1 called.");
return true;
}
// Method2 returns false.
static bool Method2()
{
Console.WriteLine("Method2 called.");
return false;
}
static bool Divisible(int number, int divisor)
{
// If the OR expression uses ||, the division is not attempted
// when the divisor equals 0.
return !(divisor == 0 || number % divisor != 0);
// If the OR expression uses |, the division is attempted when
// the divisor equals 0, and causes a divide-by-zero exception.
// Replace the return statement with the following line to
// see the exception.
//return !(divisor == 0 | number % divisor != 0);
}
static void Main()
{
// Example #1 uses Method1 and Method2 to demonstrate
// short-circuit evaluation.
Console.WriteLine("Regular OR:");
// The | operator evaluates both operands, even though after
// Method1 returns true, you know that the OR expression is
// true.
Console.WriteLine("Result is {0}.\n", Method1() | Method2());
Console.WriteLine("Short-circuit OR:");
// Method2 is not called, because Method1 returns true.
Console.WriteLine("Result is {0}.\n", Method1() || Method2());
// In Example #2, method Divisible returns True if the
// first argument is evenly divisible by the second, and False
// otherwise. Using the | operator instead of the || operator
// causes a divide-by-zero exception.
// The following line displays True, because 42 is evenly
// divisible by 7.
Console.WriteLine("Divisible returns {0}.", Divisible(42, 7));
// The following line displays False, because 42 is not evenly
// divisible by 5.
Console.WriteLine("Divisible returns {0}.", Divisible(42, 5));
// The following line displays False when method Divisible
// uses ||, because you cannot divide by 0.
// If method Divisible uses | instead of ||, this line
// causes an exception.
Console.WriteLine("Divisible returns {0}.", Divisible(42, 0));
}
}
/*
Output:
Regular OR:
Method1 called.
Method2 called.
Result is True.
Short-circuit OR:
Method1 called.
Result is True.
Divisible returns True.
Divisible returns False.
Divisible returns False.
*/