Я знаю, что ||
и &&
определены как операторы короткого замыкания на С#, и такое поведение гарантируется спецификацией языка, но также |=
и &=
короткое замыкание?
Например:
private bool IsEven(int n)
{
return n % 2 == 0;
}
private void Main()
{
var numbers = new int[] { 2, 4, 6, 8, 9, 10, 14, 16, 17, 18, 20 };
bool allEven = true;
bool anyOdd = false;
for (int i = 0; i < numbers.Length; i++)
{
allEven &= IsEven(numbers[i]);
anyOdd |= !IsEven(numbers[i]);
}
}
При попадании 9 записей allEven
становится ложным, что означает, что все последующие записи не имеют значения - значение allEven
гарантируется как ложное для всех будущих вызовов этого выражения. То же самое относится к anyOdd
, который установлен в true, когда видит 9, и останется верным для всех последующих вызовов этого выражения.
Итак, выполняются ли &=
и |=
ярлыки, или IsEven
гарантированно вызывается на каждой итерации? Есть ли какое-либо определенное поведение в спецификации языка для этого случая? Существуют ли какие-либо угловые случаи, когда такое короткое замыкание будет проблематичным?