C#自定义事件及用法实例

C#自定义事件及用法实例

在C#编程中,事件是编写高效程序不可缺少的一个重要部分。在C#中,可以使用内置的事件(System.EventHandler)来对事件进行处理。同时,也可以使用自定义的事件来实现特定要求的事件处理。

本文将详细介绍C#自定义事件及用法实例,帮助读者更好地理解事件机制并掌握自定义事件的应用。

什么是C#自定义事件

自定义事件是基于内置事件机制,通过编写自定义事件处理程序来实现的一种事件处理方式。其中,自定义事件处理程序是通过自定义事件的类来创建的。自定义事件可以与内置事件机制一样,具有触发器和处理程序两个重要的组成部分。

public class CustomEventArgs : EventArgs
{
    public string FileName { get; set; }
}

定义自定义事件处理程序的类需要从 EventArgs 类继承,并在类中

public class FileWatcher
{
    public event EventHandler<CustomEventArgs> FileChanged;

    protected virtual void OnFileChanged(CustomEventArgs e)
    {
        FileChanged?.Invoke(this, e);
    }

    public void Watch(string directoryPath)
    {
        var watcher = new FileSystemWatcher(directoryPath);
        watcher.Changed += (sender, e) => OnFileChanged(new CustomEventArgs { FileName = e.Name });
        watcher.EnableRaisingEvents = true;
    }
}

通过在自定义事件的类中定义委托(EventHanlder)和事件来建立自定义事件。这里FileChanged即为一个自定义事件,其委托类型为 EventHandler<CustomEventArgs>,通过定义事件的触发方法OnFileChanged来激活该事件。触发 FileChanged 事件时传递 CustomEventArgs 参数来允许事件处理程序运行时处理特定的数据。

在 Watcher 方法中创建 FileSystemWatcher 对象,将要监视的目录路径传到它的构造函数中,并使用 FileSystemWatcher 的 Events 属性来注册 Changed 事件的事件处理程序,以便能在文件改变时触发自定义事件。

利用 FileWatcher 类,我们可以在指定目录下监控文件变化,然后根据 The event that is triggered upon a file delete 的需求,定义一个委托来创建一个事件处理程序,并将其注册到 FileWatcher 的自定义事件上

static void Main(string[] args)
{
    var fileWatcher = new FileWatcher();
    fileWatcher.FileChanged += OnFileChanged;
    fileWatcher.Watch(@"C:\Users\jacob\Desktop\Test");
    Console.ReadLine();
}

private static void OnFileChanged(object sender, CustomEventArgs e)
{
    Console.WriteLine($"File [{e.FileName}] was changed!");
}

实例1:自定义事件处理文件剪切函数

public class FileManager
{
    public event EventHandler<FileChangeEventArgs> FileChanged;
    public event EventHandler<FileChangeEventArgs> FileCopied;

    public void Cut(string origin, string destination)
    {
        File.Move(origin, destination);
        OnFileChanged(FileChangeType.Move, origin, destination);
    }

    protected virtual void OnFileChanged(FileChangeType type, string oldPath, string newPath)
    {
        if(FileChanged != null) 
        {
            FileChanged(this, new FileChangeEventArgs(type, oldPath, newPath));
        }
    }

    public void Copy(string origin, string destination)
    {
        File.Copy(origin, destination);
        OnFileCopied(FileChangeType.Copy, origin, destination);
    }

    protected virtual void OnFileCopied(FileChangeType type, string oldPath, string newPath)
    {
        if (FileCopied != null)
        {
            FileCopied(this, new FileChangeEventArgs(type, oldPath, newPath));
        }
    }
}

public class FileChangeEventArgs : EventArgs
{
    public FileChangeType Type { get; }
    public string OldPath { get; }
    public string NewPath { get; }

    public FileChangeEventArgs(FileChangeType type, string oldPath, string newPath)
    {
        Type = type;
        OldPath = oldPath;
        NewPath = newPath;
    }
}

public enum FileChangeType
{
    Move,
    Copy
}

public class Test
{
    static void Main(string[] args)
    {
        var fileManager = new FileManager();
        fileManager.FileChanged += OnFileChanged;
        fileManager.FileCopied += OnFileCopied;
        fileManager.Cut(@"C:\Users\jacob\Desktop\Test\Test.txt", @"C:\Users\jacob\Desktop\Test\New\Test.txt");
        fileManager.Copy(@"C:\Users\jacob\Desktop\Test\Test2.txt", @"C:\Users\jacob\Desktop\Test\New\Test2.txt");
        Console.ReadLine();
    }

    private static void OnFileChanged(object sender, FileChangeEventArgs e)
    {
        Console.WriteLine($"File [{e.OldPath}] was {e.Type.ToString().ToLower()}d to [{e.NewPath}]");
    }

    private static void OnFileCopied(object sender, FileChangeEventArgs e)
    {
        Console.WriteLine($"File [{e.OldPath}] was {e.Type.ToString().ToLower()}ied to [{e.NewPath}]");
    }
}

实例2:事件的发起者和接受者

  • 事件发起者
public class Button
{
    public event EventHandler Click;

    public void ClickButton()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}
  • 事件接受者
public class Window
{
    private readonly Button _button;

    public Window()
    {
        _button = new Button();
        _button.Click += OnButtonClick;
    }

    private void OnButtonClick(object sender, EventArgs e)
    {
        Console.WriteLine("Button clicked!");
    }
}

Window 类中使用事件发起者 Button,让程序可以在按钮单击时调用与该事件相关联的回调方法。当单击按钮时,触发 Click 事件(利用事件触发器Click?.Invoke(this, EventArgs.Empty);),该事件会通知所有被注册的监听器,事件接收者 Window 中的 OnButtonClick 方法就是其中的一个监听器,用来处理事件处理程序中定义的业务逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#自定义事件及用法实例 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C# Winform实现自定义漂亮的通知效果

    下面是C# Winform实现自定义漂亮的通知效果的完整攻略。 目录 前言 准备工作 实现步骤 示例说明一 示例说明二 总结 前言 在Winform应用程序中,通知窗口往往是用MessageBox来实现的。但是MessageBox的样式过于单一,且不支持自定义,使用不够灵活。本文将介绍如何使用C#的Winform技术实现自定义漂亮的通知效果。 准备工作 Vi…

    C# 2023年6月1日
    00
  • C#实现程序单例日志输出功能

    下面是详细的讲解“C#实现程序单例日志输出功能”的完整攻略。 什么是单例模式? 单例模式是一种设计模式,它保证一个类只有一个实例,并提供全局访问点来访问该实例。 实现单例模式 实现单例模式有多种方式,这里我介绍两种比较常用的方式。 方式一:懒汉式单例 懒汉式单例是指实例在第一次被使用时才被创建的单例。以下是示例代码: public class Singlet…

    C# 2023年5月15日
    00
  • C#中使用强制类型实现字符串和ASCII码之间的转换

    C#中可以通过强制类型转换实现字符串和ASCII码之间的相互转换。下面是具体的步骤: 1.字符串转ASCII码 将字符串转成ASCII码需要使用Encoding.ASCII.GetBytes()方法,具体步骤如下: 通过Encoding.ASCII获取ASCII编码对象; 将需要转换的字符串通过Encoding.ASCII.GetBytes()方法转换成字节…

    C# 2023年6月7日
    00
  • c#中object、var和dynamic的区别小结

    针对这个问题,我整理了一份详细讲解“C#中Object、var和dynamic的区别”的攻略,下面是详细讲解: Object、var和dynamic的区别小结 在C#编程中,object、var和dynamic是三个常用的类型。虽然它们都可以存储任意类型的数据,但它们的行为却截然不同。 1. Object Object是C#中所有类型的基类,也是一个基本的数…

    C# 2023年5月15日
    00
  • C#关键字之重写override介绍

    C#关键字之重写override介绍 什么是重写 在面向对象编程中,重写是指在子类中对父类中已有的方法进行重新实现。当子类继承自父类时,子类继承了父类的方法,但是有时候子类需要对这些方法进行修改或者扩展,这就需要使用到重写。 override关键字 在C#中,使用override关键字来重写父类的方法,重写的方法必须与被重写的方法具有相同的名称、返回类型、参…

    C# 2023年6月7日
    00
  • C++下如何将TensorFlow模型封装成DLL供C#调用

    将TensorFlow模型封装成DLL供C#调用,整个过程其实可以分为以下几个步骤: 使用TensorFlow导出模型 首先需要使用TensorFlow完成模型的训练和导出。TensorFlow支持多种导出格式,这里我们使用SavedModel格式。我们可以使用如下代码导出模型: import tensorflow as tf # 定义模型 # input …

    C# 2023年5月15日
    00
  • WCF实现双向通信

    下面是关于“WCF实现双向通信”的完整攻略,包含两个示例。 1. 什么是WCF双向通信 WCF双向通信是一种WCF通信模式,它允许客户端和服务端之间进行双向通信。在WCF双向通信中,客户端和服务端都可以发送和接收消息,这使得WCF双向通信非常适合实现实时通信。 2. 示例1:创建WCF服务 以下是一个示例,演示如何创建WCF服务: using System;…

    C# 2023年5月15日
    00
  • Unity InputFiled TMP属性和各种监听示例详解

    Unity InputField TMP属性和各种监听示例详解 什么是InputField? InputField是Unity中的一个UI控件,它可以让用户在UI界面中输入文本。InputField通常结合TextMeshPro(简称TMP)组件使用,用于控制文本的显示。InputField有丰富的属性和事件可以掌控,本文将详细解析。 InputField常…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部