Некоторые языки, такие как C ++, позволяют компилятору выбирать, какие выражения порядка оцениваются в данном операторе.Но C # устраняет эту неоднозначность: оценка всегда слева направо.
textBox1.Text += await task;
В C # нет специального оператора + =, он просто расширяется до:
textBox1.Text = textBox1.Text + await task;
Теперь, еслимы оцениваем слева направо, первое, что он должен оценить, это textBox1.set_Text для назначения.Если бы вы сделали что-то с правой стороны, которое изменило бы значение textBox1, вы все равно бы присвоили исходное textBox1, а не новое значение.
Следующее, что нужно оценить, это textBox1.get_Text,Это должно вернуть ваше значение "".
Затем он оценивает "задачу ожидания".В этот момент он застревает в ожидании и не может продолжить оценку оператора, поэтому он сбрасывает важное содержимое текущего стекового фрейма в объект кучи для дальнейшего использования.Когда он возвращается для продолжения оценки, у нас теперь есть следующая информация:
- Адрес объекта, в который мы собираемся записать.
- Строковое значение "".
- Строковое значение "1".
Осталось только добавить захваченное "" к ожидаемому "1" и присвоить его захваченному textBox1.
Если вы сделаете это несколько раз подряд, все 3 входа будут одинаковыми каждый раз.Другими словами, он ведет себя именно так, как должно быть, как описано в стандарте.Советы, которые люди дают, чтобы поместить его в предыдущую строку, вот так:
var temp = await task;
textBox1.Text += temp;
Это просто перемещает ожидание перед textBox1.Text.На самом деле вы можете сделать реорганизацию в строке и дать ожидаемые результаты, просто поменяв порядок выражений внутри оператора:
textBox1.Text = string.Concat(
new[] { await task, textBox1.Text }.Reverse());