Ответ 1
Он перестанет оценивать, потому что вы используете двойной амперсанд && оператор. Это называется short-circuiting.
Если вы изменили его на один ampsersand:
if(myList.Count > 0 & myString.Equals("value"))
он будет оценивать оба.
Если у меня есть оператор If
с 2 условиями - и первый сбой, будет ли второе условие даже рассмотрено или оно будет прямо на else
? Итак, в следующем примере, если myList.Count == 0
, будет myString
сравниваться со значением "значение" или будет просто прямо на else
?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
Он перестанет оценивать, потому что вы используете двойной амперсанд && оператор. Это называется short-circuiting.
Если вы изменили его на один ampsersand:
if(myList.Count > 0 & myString.Equals("value"))
он будет оценивать оба.
Нет, это не будет рассмотрено. (Это называется короткое замыкание.)
Компилятор достаточно умен (и требуется спецификацией языка), чтобы знать, что если первое условие false
, нет способа выразить выражение для true
.
И поскольку Яков указал на ||
, когда первое условие true
, второе условие не будет оценено.
Если логическим оператором является AND (& &), то оператор IF будет оценивать первое выражение - если первый из них является ложным, он не будет оценивать второй. Это полезно, чтобы проверить, является ли переменная нулевой до вызова метода в ссылке - чтобы исключить исключение из null-указателя
Если логическим оператором является OR (||), то оператор IF будет оценивать первое выражение - если первое истинно, оно не будет оценивать второе.
Компиляторы и среды выполнения оптимизированы для этого поведения
Нет, второе условие будет пропущено, если вы используете &&
,
Если вы используете &
, это будет считаться
Рассмотрим следующее:
static int? x;
static int? y;
static void Main(string[] args)
{
x = 5;
if (testx() & testy())
{
Console.WriteLine("test");
}
}
static Boolean testx()
{
return x == 3;
}
static Boolean testy()
{
return y == 10;
}
Если вы проследите как функции testx, так и testy, будут evaulated, хотя testx был ложным.
Если вы измените тест на && проверен только первый.
В вашем примере второй оператор будет оцениваться только в том случае, если первый сбой. Логический И &&
будет возвращать только true
, когда оба операнда верны, например, оценка короткого замыкания.
.NET поддерживает short circuiting
, поэтому, когда первое условие выходит из строя, оно не будет проверять вторую ситуацию... В С# || и && являются короткозамкнутыми версиями логических операторов | и соответственно.... Это часто бывает быстрее...
Выражение будет оцениваться слева направо, поскольку это логическая операция И. Если значение false, оно прекратит оценку. Он также имеет наибольший приоритет операций в вашем выражении.
Оператор условного-И (& &) выполняет логическое-И его операндов bool, но при необходимости оценивает его второй операнд. Условный и оператор (& > ) MSDN
Вот набор разделов, в которых перечислены операторы С#, начиная с наивысшего приоритета до самого низкого.