当关闭事件中的“e.Cancel”使用FormClosing事件时,为什么代码e.Cancel=true;工作,但newCancelEventArgs().Cancel=true;不起作用?privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse){e.Cancel=true;新的CancelEventArgs().Cancel=true;}此事件由Winforms管道代码引发。它可以看到自定义事件处理程序想要更改默认行为的唯一方法是通过e对象。创建新的CancelEventArgs对象没有管道可以检测到的副作用。还有其他错误,为了外部代码的利益而引发事件,让它知道发生了什么,并为其提供更改行为的选项。这里没有外部代码,事件处理程序实际上是引发事件的同一个类的一部分。换句话说,窗体正在监听它自己的事件。有更好的方法来处理它,您可以重写引发事件的方法。像这样:protectedoverridevoidOnFormClosing(FormClosingEventArgse){e.Cancel=true;base.OnFormClosing(e);现在外部代码可以覆盖默认行为并在OnXxxx方法运行后引发事件。您可以选择,如果您不希望外部代码覆盖该行为,只需交换这两个语句。我认为代码完全按照它说的做;缺少的是字面阅读。当您为e.Cancel分配新值时,您正在修改作为函数参数提供的e。事件处理程序函数完成后,此FormClosingEventArgs实例(包括在事件处理程序中对其所做的任何更改)将可用于调用事件处理程序的任何代码。在这种情况下,几乎可以肯定是Microsoft编写的Winforms代码。另一方面,当您在该事件处理程序中创建一个FormClosingEventArgs类型的新实例并对其执行某些操作时,没有任何信息可以提供给调用者;你需要明确的东西。由于调用者在事件处理程序完成后会看到事件处理程序传入的参数值,因此您需要以某种方式用新创建的实例替换调用者用e看到的内容。在其他情况下,此类结果可能作为返回值提供。通常,对于某些类型T,newT()的结果是类型T的一个实例。因此,您可以像使用类型T的非空变量一样使用表达式newT()的结果。在在您的特定情况下,您正在为类型T的属性分配一个值(具体来说,是从它创建的该类型的实例)。(有一种构造函数失败的特殊情况,但暂时不要去那里;对于简单类型,这几乎意味着您处于如此可怕的情况,以至于您的程序在任何情况下都无法继续运行。)这里重要的是,如果您不在任何地方分配表达式newT()本身的结果,一旦语句完成,新创建的实例将被丢弃(技术上变得不可访问)。然后在稍后的某个时间点,.NET垃圾收集器启动并实际回收分配的内存。它与在一个函数中分配变量、从另一个函数调用该函数并尝试访问从第二个函数分配的变量以将变量从第一个函数传递到第二个函数无关实际上没有什么不同,除了只有一个这里涉及功能。在事件处理程序中执行类似于第二行代码的操作是非常不寻常的,但如果调用构造函数有一些副作用(例如触发延迟加载),原则上是可行的。这段代码肯定只是检查它protectedoverridevoidOnFormClosing(FormClosingEventArgse){base.OnFormClosing(e);如果(PreClosingConfirmation()==System.Windows.Forms.DialogResult.Yes){Dispose(true);应用程序.退出();}else{e.Cancel=true;}}privateDialogResultPreClosingConfirmation(){DialogResultres=System.Windows.Forms.MessageBox.Show("你想退出吗?","退出...",MessageBoxButtons.YesNo,MessageBoxIcon.Question);返回资源;快乐编码这是因为CancelEventArgs是在代码中传递给事件处理程序的对象引用。幕后代码使用CancelEventArgs对象引发FormClosing,并且所有事件处理程序都接收相同的对象。轮到所有处理程序后,后台代码会检查它发送的CancelEventArgs对象,以查看其Cancel属性是否设置为true。如果是,那么它什么都不做并且FormClose事件链停止。如果Cancel为false(CancelEventArgs默认值),意味着它尚未设置为Cancel事件链,则幕后代码将继续执行,然后引发FormClosed事件。您可以在MSDN上阅读有关Form.FormClosing事件的更多信息。表单上的所有-ing事件通常都跟在-ed事件之后。-ing事件通常有一个CancelEventArgs,可以将其Cancel属性设置为true以防止-ed事件发生。以上就是C#学习教程:关闭事件中“e.Cancel”分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
