为什么我需要那条线? (C#)

时间:2015-09-04 06:32:14

标签: c#

我需要帮助理解为什么我需要在以下代码中使用此行,以及它的作用:

public Form1()
{
    InitializeComponent();
    this.Location = Settings.Default.WindowLocation;
    this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    Settings.Default.WindowLocation = this.Location;
    Properties.Settings.Default.Save();
}

如果我不添加该行,则永远不会发生保存。就像Form1_FormClosing函数中的代码不执行一样,因此程序始终以默认值开头。但是我从来没有像其他事件那样使用像buttonclicks等其他事件。没有它就可以正常工作。为什么这个不一样?

data class MyData @PersistenceConstructor constructor(val a: Int?, val b:String, val c : Collection<Int>) {
  constructor(a: Int? = null, b: String = "", c: Collection<Int> = emptyList()) : this(a,b,c)
}

对于这个愚蠢的问题感到抱歉,但我对C#(或编程......)一无所知。我只是想为我的程序编写一个简单的GUI。在我发现我需要这条线之后它现在完美地工作了......我只想理解为什么。

1 个答案:

答案 0 :(得分:1)

FormClosing事件发生在表单关闭之前,由用户,用户界面(UI)或以编程方式,通过调用Form类中的Close或Application类中的Exit等方法。此活动可以取消。

创建FormClosingEventHandler委托时,您将标识将处理该事件的方法。要将事件与事件处理程序相关联,请将该委托的实例添加到事件中。除非您删除委托,否则每当事件发生时都会调用事件处理程序。

C#中的委托类似于C或C ++中的函数指针。使用委托允许程序员封装对委托对象内的方法的引用。然后可以将委托对象传递给可以调用引用方法的代码,而无需在编译时知道将调用哪个方法。与C或C ++中的函数指针不同,委托是面向对象的,类型安全的和安全的。

委托声明定义了一种类型,该类型使用一组特定的参数和返回类型封装了一个方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象封装实例上的实例和方法。如果您有一个委托对象和一组适当的参数,则可以使用参数调用委托。

委托的一个有趣且有用的属性是它不知道或不关心它引用的对象的类。任何物体都会做;重要的是方法的参数类型和返回类型与委托的匹配。这使得委托非常适合“匿名”调用。

委托可以被视为/某些方法的占位符。

通过定义委托,您要对您的班级用户说“请随意在此处放置与此签名匹配的任何方法,并且每次调用我的委托时都会调用它。”

典型的用途当然是事件。所有OnEventX都委托给用户定义的方法。

代表可以为对象的用户提供一些自定义行为的功能。大多数情况下,您可以使用其他方式来实现相同的目的,我不相信您可能会被迫创建委托。在某些情况下,这是完成任务的最简单方法。

来自FormClosingEventHandler MSDNDelegate MSDN

的参考