Я думаю, что код делает именно то, что говорит; чего не хватает, так это буквального прочтения.
Когда вы присваиваете новое значение e.Cancel
, вы изменяете e
, который предоставляется в качестве параметра функции. После завершения функции обработчика события этот экземпляр FormClosingEventArgs
, включая любые изменения, внесенные в него из обработчика события, будет доступен для любого кода, вызвавшего обработчик события. В данном случае это почти наверняка код Winforms, написанный Microsoft.
С другой стороны, когда вы внутри этого обработчика событий создаете новый экземпляр типа FormClosingEventArgs
и что-то делаете с ним, ничто не может предоставить эту информацию вызывающей стороне; вам понадобится что-то явное для этого. Так как вызывающая сторона смотрит на значение параметра, который она передала после завершения обработчика события, вам нужно каким-то образом заменить содержимое e
, как видно вызывающей стороне, на вновь созданный экземпляр. В других случаях такой результат может быть предоставлен как возвращаемое значение.
В общем случае результат new T()
для некоторого типа T
является экземпляром типа T
. Таким образом, вы можете работать с результатом выражения new T()
, как если бы вы имели ненулевую переменную типа T
. В вашем конкретном случае вы присваиваете значение свойству типа T
(в частности, создан экземпляр этого типа). (Существует особый случай, когда конструктор терпит неудачу, но давайте пока не будем здесь; для простых типов это в значительной степени будет означать, что вы находитесь в таком тяжелом положении, что ваша программа вряд ли сможет продолжить работу в любом случае. )
Здесь важно то, что, если вы нигде не назначите результат выражения new T()
, вновь созданный экземпляр будет отброшен (технически становится недоступным) после завершения инструкции. Затем, в какой-то момент, включается сборщик мусора .NET и фактически освобождает выделенную память. На самом деле это ничем не отличается от размещения переменной в одной функции, вызова этой функции из другой функции и попытки доступа к переменной, выделенной таким образом из второй функции, без каких-либо действий для передачи переменной из первой функции во вторую, кроме как здесь. задействована только одна функция.
Выполнение чего-то вроде вашей второй строки кода в обработчике событий было бы довольно необычно, но может в принципе быть допустимым, если вызов конструктора имеет какой-то побочный эффект, который вы хотите использовать, например, запуск ленивой загрузки.