Я почесал голову над этим, поскольку эти выражения кажутся почти идентичными, кроме формата - однако сокращенное, кажется, оценивает по-разному и создает ложные срабатывания, возвращая true, когда это не должно.
В следующих примерах представьте programRecord.Award = 'Emmy'
и targetAward = 'Oscar'
Неверный код, дающий ложные срабатывания:
private bool MatchMe(string programId, string targetAward, string targetLevel, Program programRecord)
{
var isMatched = programRecord.Status == "Active"
&& string.IsNullOrEmpty(programId) ? true : programRecord.Pid == programId
&& string.IsNullOrEmpty(targetAward) ? true : programRecord.Award == targetAward
&& string.IsNullOrEmpty(targetLevel) ? true : programRecord.Level == targetLevel;
return isMatched;
}
Хороший код:
private bool MatchMe(string programId, string targetAward, string targetLevel, Program programRecord)
{
var isMatched = programRecord.Status == "Active";
var isMatched2 = string.IsNullOrEmpty(programId) ? true : programRecord.Pid == programId;
var isMatched3 = string.IsNullOrEmpty(targetAward) ? true : programRecord.Award == targetAward;
var isMatched4 = string.IsNullOrEmpty(targetLevel) ? true : programRecord.Level == targetLevel;
var doIMatch = isMatched && isMatched2 && isMatched3 && isMatched4;
return doIMatch;
}
Что такоепроисходит в сокращенной версии, которая вызывает это?Я бы подумал, что одно ложное значение заставит весь оператор возвращать ложь, однако этого не происходит с сокращенной версией.