Например, если этот код:Есть ли? оператор гарантирует только однократное выполнение левого аргумента?
int? ReallyComplexFunction()
{
return 2; // Imagine this did something that took a while
}
void Something()
{
int i = ReallyCleverFunction() ?? 42;
}
... это гарантирует, что функция будет вызываться только один раз? В моем тесте он называется только один раз, но я не вижу никакой документации, в которой я могу полагаться, что это всегда так.
Редактировать
я могу догадаться, как это реализовано, но c'mon: мы разработчики. Мы не должны путаться с догадками и предположениями. Например, будут ли все будущие реализации одинаковыми? Будет ли реализация другой платформы языком одинаковой? Это зависит от спецификаций и гарантирует. Например, будущее или другой платформы (не хороший, но это возможно), может сделать это в ??
реализации:
return ReallyComplexFunction() == null ? 42 : ReallyComplexFunction();
То, назвали бы ReallyComplexFunction
дважды, если он не вернется null
. (Хотя это выглядит нелепой реализации, если заменить функцию с обнуляемого переменной выглядит вполне разумно: return a == null ? 42 : a
)
Как уже говорилось выше, я знаю, в моем тесте это только раз, но мой вопрос делает C# Спецификация гарантирует/указывает, что левая сторона будет вызываться только один раз? Если да, то где? Я не вижу такого упоминания в C# Language Specification for ?? operator (где я первоначально искал ответ на мой запрос).
Почему вы думаете, что это будет называться дважды? –
The ?? оператор вызывает левый, видит, является ли он нулевым, если он затем возвращается вправо. Его следует называть только один раз –
Где этот вопрос, даже исходящий? Вы ссылаетесь на «функцию», но показываете два разных, даже не понятно, к какой строке вы даже обращаетесь. -1 для глупого вопроса и неопределенности. Вы не могли бы беспокоиться, чтобы просто * запустить * его и узнать? – tnw