2.7C#函数成员之事件(Event)

事件委托签名

用于定义事件以及订阅或取消订阅事件的语法是对委托语法的扩展。

参数列表包含两种参数:发件人和事件参数。第一个参数 sender 的编译时类型为 System.Object,第二个参数通常是派生自 System.EventArgs 的类型。

void EventHandler<FileFoundArgs>(object sender, EventArgs args);

事件声明

事件的声明方式与字段类似,区别是事件声明包括 event 关键字,且类型必须是委托类型,因此事件是委托类型的对象。

event 委托类型 事件;
public event EventHandler<FileFoundArgs> FileFound;

引发事件

想要引发事件时,使用委托调用语法调用事件处理程序(event handler)。

//this指向当前委托示例所指向的目标方法,new FileFoundArgs(file)为传给目标方法的参数,invoke的返回值为目标方法的返回值
public class FileSearcher
{
    public event EventHandler<FileFoundArgs> FileFound;

    public void Search(string directory, string searchPattern)
    {
        foreach (var file in Directory.EnumerateFiles(directory, searchPattern))
        {
            FileFound?.Invoke(this, new FileFoundArgs(file));
        }
    }
}


public class FileFoundArgs : EventArgs
{
    public string FoundFile { get; }

    public FileFoundArgs(string fileName)
    {
        FoundFile = fileName;
    }
}

订阅事件和取消订阅

事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。任何其他组件都可以订阅事件,并在事件引发时得到通知。

通过订阅事件,还可在两个对象(事件源和事件接收器)之间创建耦合。 需要确保当不再对事件感兴趣时,事件接收器将从事件源取消订阅。

通过使用 += 运算符订阅事件,使用 -= 运算符取消订阅。

EventHandler<FileFoundArgs> onFileFound = (sender, eventArgs) =>
{
    Console.WriteLine(eventArgs.FoundFile);
    filesFound++;
};

//订阅事件
fileLister.FileFound += onFileFound;

//取消订阅
fileLister.FileFound -= onFileFound;

示例

你可能已在某些编程中使用过事件。 许多图形系统都具有用于报告用户交互的事件模型。 这些事件会报告鼠标移动、按钮点击和类似的交互。 这是使用事件的最常见情景之一,但并非唯一的情景。

public delegate void EventHandler(object sender, EventArgs e);

public class Button: Control
{
    public event EventHandler Click;
}

public class LoginDialog: Form
{
    Button OkButton;
    Button CancelButton;

    public LoginDialog() {
        OkButton = new Button(...);
        OkButton.Click += new EventHandler(OkButtonClick);
        CancelButton = new Button(...);
        CancelButton.Click += new EventHandler(CancelButtonClick);
    }

    void OkButtonClick(object sender, EventArgs e) {
        // Handle OkButton.Click event
    }

    void CancelButtonClick(object sender, EventArgs e) {
        // Handle CancelButton.Click event
    }
}

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/8221.html

发表评论

登录后才能评论