c#软件开发学习笔记--事件、分层结构

C#学习笔记(十七)事件(四)事件个人总结 若要写一个事件:首先要明确:一个完整的事件由五部分组成:事件拥有者、事件、事件响应者、事件处理器、订阅。 用C#来写 阅读详情

c#软件开发学习笔记

第一部分 C#事件机制

1.1 事件的基本概念

1.1.1 什么是事件

事件(Event) 是C#中一种特殊的机制,本质上是多播委托(Multicast Delegate)的封装。事件用于实现发布-订阅(Publisher-Subscriber)设计模式,是面向对象编程中实现松耦合的重要手段。
事件(Event) 是一种特殊的多播委托,具有以下特点:

特性说明
封装性只能从声明类内部触发
安全性外部只能订阅/取消订阅
发布-订阅模式实现组件解耦

1.1.2 现实世界中的事件类比

现实事件C#事件机制说明
报纸订阅事件订阅用户订阅报纸(事件),报社发布新报纸(触发事件)
邮件通知事件触发系统发生特定操作时,向订阅者发送通知
电视频道事件广播电视台广播节目,多个观众同时接收
股票涨跌提醒事件处理设置股价提醒,股价变动时自动通知

1.2 事件的定义与语法

1.2.1 事件的基本语法

// 事件定义的基本格式
访问修饰符 event 委托类型 事件名;

// 事件定义的完整语法
public static event EventHandler MyClick;

1.2.2 使用EventHandler内置委托

using System;

namespace _3事件
{
    internal class Program
    {
        // 定义一个事件
        // 语法: public event 事件类型 事件名
        // - event: 关键字
        // - EventHandler: 事件的基类(内置委托类型)
        // - MyClick: 事件名
        public static event EventHandler MyClick;

        static void Main(string[] args)
        {
            // 事件:具体的一个操作,例如鼠标点击操作、鼠标移动等操作
            // 事件基于发布-订阅设计模式进行实现
            
            // 发布类: 是一个包含事件和委托定义的对象
            // 订阅类: 是一个接受事件并提供事件处理程序的对象

            // 给事件赋值 - 事件其实就是委托的实例
            // EventHandler 要求函数必须有两个参数
            MyClick += new EventHandler(F1);
            MyClick += (sender, e) =>
            {
                Console.WriteLine("lambda表达式");
            };
            
            // 调用事件
            MyClick(null, null);
        }

        static void F1(object sender, EventArgs s)
        {
            Console.WriteLine("F1方法");
        }
    }
}

1.2.3 自定义委托类型的事件

using System;

namespace _4例子
{
    /// <summary>
    /// 订阅类:绑定事件(事件变量赋值使用+=函数进行赋值)
    /// </summary>
    internal class Program
    {
        static void Main(string[] args)
        {
            Calc c = new Calc();
            c.Finished += F1;  // 给事件绑定方法,事件变量赋值,订阅事件
          
            c.Add(10, 20);
            c.Add(30, 20);
        }

        /// <summary>
        /// 展示的俩个数字以及结果方法F1,打印a b 和
        /// </summary>
        static void F1(int a, int b, int c)
        {
            Console.WriteLine($"a的值为{a}, b的值为{b}, c的值为{c}");
        }
    }

    /// <summary>
    /// 发布类:定义事件对象和委托对象
    /// </summary>
    public class Calc
    {
        // 定义委托类型,等同于一个enum类型定义
        public delegate void AddDel(int a, int b, int sum);

        // 根据委托类型定义事件实例,等同于enum类型一个实例
        public event AddDel Finished;

        /// <summary>
        /// 加法计算方法
        /// </summary>
        /// <param name="a">第一个加数</param>
        /// <param name="b">第二个加数</param>
        public void Add(int a, int b)
        {
            int sum = a + b;
            // 执行事件
            Finished?.Invoke(a, b, sum);
        }
    }
}

1.3 事件的安全性

事件相比普通委托实例具有以下安全特性:

特性普通委托事件
外部调用可以从任何地方调用只能在声明类内部调用
访问控制完全公开可以限制访问级别
封装性无有
安全性低高

1.4 事件的订阅与取消订阅

1.4.1 订阅事件的多种方式

public class EventDemo
{
    // 定义事件
    public event EventHandler Click;

    public void Demo()
    {
        // 方式1:使用 += 订阅事件(最常用)
        Click += HandlerMethod1;

        // 方式2:使用 new EventHandler 订阅
        Click += new EventHandler(HandlerMethod2);

        // 方式3:使用匿名方法订阅
        Click += delegate(object sender, EventArgs e)
        {
            Console.WriteLine("匿名方法处理");
        };

        // 方式4:使用Lambda表达式订阅
        Click += (sender, e) =>
        {
            Console.WriteLine("Lambda表达式处理");
        };
    }

    private void HandlerMethod1(object sender, EventArgs e)
    {
        Console.WriteLine("方法1处理");
    }

    private void HandlerMethod2(object sender, EventArgs e)
    {
        Console.WriteLine("方法2处理");
    }
}

1.4.2 取消订阅事件

public class UnsubscribeDemo
{
    public event EventHandler MyEvent;

    public void Demo()
    {
        // 订阅事件
        MyEvent += Handler1;
        MyEvent += Handler2;

        // 取消订阅 - 使用 -=
        MyEvent -= Handler1;

        // 注意:取消订阅时,方法和订阅时必须是同一个实例
        // 如果使用匿名方法或Lambda,需要保存引用才能取消
        EventHandler lambdaHandler = (s, e) => Console.WriteLine("Lambda");
        MyEvent += lambdaHandler;
        MyEvent -= lambdaHandler;  // 这样才能取消
    }

    private void Handler1(object sender, EventArgs e) { }
    private void Handler2(object sender, EventArgs e) { }
}

1.5 事件与委托的区别

特性委托事件
本质存储函数引用的类型特殊的委托实例
访问权限可以从任何地方调用只能在声明类内部调用
封装性无限制受限(封装在类内部)
安全性较低较高
使用场景回调、泛型方法参数对象间通信、解耦
外部修改可以直接赋值和调用只能订阅/取消订阅

第二部分 分层结构设计

2.1 分层架构概述

2.1.1 什么是分层架构

分层架构(Layered Architecture) 是一种将系统划分为多个逻辑层次的软件架构模式,每一层都有特定的职责,通过定义良好的接口进行通信。

2.1.2 经典三层架构

┌─────────────────────────────────────────────────────────────┐
│                    用户界面层 (UI Layer)                    │
│  - 负责与用户交互                                          │
│  - 接收用户输入,显示处理结果                               │
│  - 数据展示和格式转换                                       │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                   业务逻辑层 (BLL/Business)                  │
│  - 处理业务规则和逻辑                                         │
│  - 数据验证和转换                                            │
│  - 业务流程编排                                              │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    数据访问层 (DAL/Data Access)              │
│  - 与数据库交互                                             │
│  - CRUD操作实现                                             │
│  - 数据持久化                                               │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      数据源 (Data Source)                    │
│  - 数据库                                                    │
│  - 文件系统                                                  │
│  - 外部服务                                                  │
└─────────────────────────────────────────────────────────────┘

2.2 分层结构的优势

优势说明
高内聚低耦合每个层职责单一,层间依赖最小化
可维护性修改一层不影响其他层
可测试性每层可以独立测试
可扩展性新增功能只需在相应层添加
团队协作不同团队可并行开发不同层
代码复用通用功能在Common层复用

2.3 分层职责

层级职责包含内容
UI层用户交互Program.cs、Form.cs
Common层通用工具验证器、配置、日志
BLL层业务逻辑业务规则处理
IDAL层接口定义接口声明
DAL层数据访问CRUD实现
Model层数据模型实体类
【C#学习笔记】窗体事件 目录1. 窗体基本事件1.1 窗体初始化的流程1.2 修改窗体变量1.3 窗体关闭1.4 窗体大小被改变 1. 窗体基本事件 1.1 窗体初始化的流程 选中窗体,双击: 任何控件都有一个基本属性,name:用来确定是哪个控件。 private void Formtest_Load(object sender, EventArgs e) 窗体第一次被初始化。(窗体标题、大小、是否允许最大化最小化) 一般,用户初始化代码,写在_Load函数中。 **InitializeComponent()**是先被执 阅读详情

相关推荐

C#分层开发架构的实例解析与应用

本文还有配套的精品资源,点击获取 简介:C#中的分层开发是一种架构模式,将系统分为业务层、逻辑层、数据层和接口层等相互协作的层次,每个层次都专注于特定职责。本例子详细介绍了每个层次的实现和它们的重要性,强调了分层架构在提高代码可维护性、可扩展性和团队协作中的作用。通过掌握各层次职责,开发者能够构建高效稳定的系统,为初学者理解分层开发提供了良好的学习材料。 1. C#分...

weixin_42594419的博客 1314

【C#进阶】C# 事件

🌍 hello大家好啊,我是哈桑。本文为大家介绍 C# 中的事件。事件本质上来讲是一种特殊的多播委托1,只能从声明它的类中进行调用。事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。C# 中常常会使用事件来实现线程之间的通信。不仅是在类中,在接口中也可以声明事件,称为接口事件。接口事件的实现和接口上的方法或属性的实现是一样的,以一个示例来说明如何在类中实现接口事件。

好学若饥,谦卑若愚。 5302

C# WinForms实战:5分钟用ScottPlot打造专业级示波器界面(附完整代码)

本文详细介绍了如何在C# WinForms应用中,利用ScottPlot.WinForms库快速构建一个专业级的软件示波器界面。通过从环境配置、静态波形绘制到动态数据实时更新的完整实战演示,帮助开发者高效实现高性能的波形显示功能,适用于工业监控、信号分析等多种场景。

weixin_29198045的博客 831

C#学习笔记8:接口、委托、事件

今日继续我的C#学习之路,今日学习接口、委托、事件 文章从实践出发学习这三个设计理念,并提供完整源码

NULL指向我的博客 1992

dify案例-基于Dify打造智能合同审查助手:零代码搭建工作流全指南

Dify的工作流(Workflow)功能是一个可视化流程编排工具,允许用户通过拖拽节点的方式构建复杂的AI应用。与简单的问答应用不同,工作流支持多步骤任务处理、条件分支、并行执行等高级功能,非常适合合同审查这类结构化任务。可视化编排:无需编写代码,通过拖拽连接节点即可构建复杂流程多模型协作:可在不同节点使用最适合的AI模型灵活集成:支持知识库检索、条件判断、API调用等多种节点类型迭代优化:可随时测试和调整单个节点,不影响整体流程可视化搭建:无需编码经验,拖拽式构建复杂审查流程灵活扩展。

weixin_44245188的博客 1939

AMD Ryzen AI Max+ 395四机集群实战:开源工具链与大模型推理优化全解析

本文详细解析了基于AMD Ryzen AI Max+ 395处理器的四机集群搭建与优化实践,涵盖硬件配置、开源工具链评测及大模型推理优化技巧。通过深度测试,揭示了集群在AI推理中的性能瓶颈与解决方案,特别适合需要扩展显存的大模型实验场景。文章还提供了成本效益分析,帮助开发者做出更明智的选型决策。

weixin_29041767的博客 1521

关于c#中的事件

c#事件学习

每天进步一点点 1万+

网络安全实战:从Wireshark到BurpSuite的抓包技巧解析

本文深入解析了Wireshark和BurpSuite在网络安全抓包中的实战技巧,从基础对比到高级过滤、核心模块应用及安全测试避坑指南。通过详细的操作步骤和案例分析,帮助读者掌握数据包抓取与分析的核心技能,提升网络安全防护能力。

weixin_29207533的博客 573

C# 事件

事件是依赖于委托,没有委托无法创建。

一个有料的码农 3255

代谢组数据分析(三十一):空间代谢组学分析从数据加载到通路分析的流程解析

空间代谢组学是一种先进的技术,能够在组织切片上以高分辨率检测代谢物分布,为理解生物代谢过程提供新视角。其分析流程包括数据获取、预处理、代谢物注释、差异表达分析、可视化、通路分析、聚类分析及空间相关代谢物分析等关键步骤。这些步骤帮助研究人员从海量数据中提取有价值信息,揭示代谢物的空间分布规律,发现潜在生物标志物,探索代谢通路调控机制。例如,SpaMTP等工具为全流程分析提供了强大支持,助力研究人员高效处理数据,深入理解代谢过程,为生物学研究和临床应用提供重要依据。

专注生信领域 918

【ComfyUI】Wan 2.2 14B 首尾帧转视频 平滑过渡

本文介绍了基于 Wan2.2 ComfyUI 的视频生成工作流,通过预训练模型、提示词与参考图像的结合,实现高质量视频合成。工作流采用高低噪声模型与 LoRA 模块优化风格与细节,确保画面过渡平滑稳定。核心流程包括模型加载、图像输入、提示词编码、潜空间采样、解码与视频合成,最终生成动态转场视频。节点设计涵盖 CLIPTextEncode、KSamplerAdvanced 等关键模块,协同完成从文本到视频的全链路生成。正向提示词作为核心驱动力,直接影响视频的动作、镜头与画面变化。

Mr数据杨 1702

深入理解C#中的事件驱动编程

在C#中,事件是一种特殊类型的多播委托,它可以绑定到多个方法上。事件被设计用来发送信号,表示已经发生了某些特定的动作。这些动作可以由对象内部触发,如状态的改变,也可以由外部触发,如用户输入。事件的使用涉及三个主要组成部分:事件的定义、事件的发布(触发)和事件的订阅(响应)。下面我们通过一个简单的例子来逐步解析这些概念。首先,我们定义一个事件set;这个类简单地包含了一个UserName属性,用来传递新创建的用户名称。C#中的事件提供了一种强大的机制,允许开发者以松耦合的方式编写响应特定动作的代码。

波波诸葛伟 1687

智能工厂评估模型研究

摘要:通过对国内外现有智能制造评估模型的研究,结合重庆制造业行业领跑者与落后者之间差距大的现状,以实现全要素全连接的数字化工厂为出发点,融合工业互联网标识,构建实践可行的智能工厂评估模型推动中小型企业参与智能制造转型,缓和两极分化问题。本评估模型包含工厂体系架构的3个层级,提供用于推动智能制造转型的参考,包括设计、生产、管理的全过程评估。关键词:智能制造评估模型;智能制造转型;全连接工厂;工业互联网标识0 引言受行业需求与技术创新的影响,全球制造业在历经了工业1.0机械化、工业2.0电气化和工业3.0自动

罗伯特技术屋 677

C#学习笔记之事件

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。 C# 中使用事件机制实现线程间的通信。 事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器 类。其他接受该事件的类被称为 订阅器 类。事件使用 发布-订阅 模型。 发布器 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器类的对象调用这个事件,并通知其他的对象。

IT技术猿猴的博客 1290

CS之攻击菜单详解-后门生成与上线

能够生成如HTA文档、office宏、payload生成器、exe程序。 windows可执行程序exe 可以看到能生成两种windows可执行程序,其分别代表stage分阶段和unstage(stageless)不分阶段。传送门 ——>Cobalt Strike中payload的stage与unstage区别 选择监听器后,按需生成不同类型的exe 然后在目标机器运行即可上线 payload生成器 选择生成如下类型的后门 ——>https://che...

渗透之路,攻防之间皆学问 6808

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C#事件2

今天又来说一下C#中的事件,为什么会有这个又呢?一个是因为以前写过一篇关于事件的东西,二来呢是因为感觉接口这个东西完全可以替换委托来写事件。因为这两个方面的原因,重新过了一遍C#中的事件。 事件这个东西C#中定义事件的是EventHandler这个委托,所以呢我们暂且按照C#这个模式写一个简单的事件,代码如下: 这个类很简单,一个汽车类,包含一个字段,以及其相应的属性,然后是构...

aedh83655的博客 138

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C#学习笔记 事件

事件(event)是在委托的基础上实现的一种“通知机制”。比如,当一个按钮被点击,就是一个事件,事件的发生可以通知相关的程序进行处理。事件相当于其他语言中的回调函数,或事件监听类。 对于Button类来说,Click是其中一个特殊的属性,它就代表一个事件,它的类型是EventHandler委托,是的,关于事件有几个关键点: 在一个类中定义一个事件,事件的类型是一个委托类型 在外面用 += 来注册这个事件,即将一个外部方法关联上了 在事件源所在的类中,在一定条件下(即事件发生了)来调用这个委托,实际上是调用

不导翁的博客 268

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【C#学习笔记】C#中事件

上篇在学习委托的时候介绍了C#中的事件是一种特殊的委托,它用于提供一种机制来实现发布-订阅模式,允许对象在某个条件或状态改变时通知其他对象。委托是事件的基础,事件相当于委托的封装。事件由5个关键要素组成,分别是委托类型、事件声明、事件订阅、事件触发、事件取消订阅。

Ho博客 468

C#事件

C#事件的用法与意义C#事件与委托十分相似,其实事件包含了一个私有委托,所以事件就像是专门用于某种特殊用途的简单委托。事件使用的方法图:正如上图所示,发布者类Incrementer里面的事件CountedADozen就像一个装方法的容器,这个容器对方法的添加与删除是里面的私有委托来实现的(这里待会儿可以通过代码理解),发布者类Incrementer还有一块触发事件的代码,这段触发事件代码的方法是那...

Mr Onehundred 1万+

C#学习笔记:事件与委托

参考书目:C#6.0学习笔记——从第一行C#代码到第一个项目设计(作者周家安) 学习目的:掌握事件与委托的用法,定义一个委托类型,作为响应按下空格键这一事件。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; u...

qq_41708281的博客 235

也谈JAVA事件和C#事件

             再未识JAVA之前,看JAVA语法和C#惊人的相似,因此就很盲目的认为会C#就会JAVA两者基本是一个东西-_-#,直到最近处理一些代码需要用到事件来隔离视图和控制时才发现原来两者相似只是表层上,底层的东西完全不一样,JAVA有着自己的机制,C#是从C++发展过来的东西,虽然丢掉了指针,但是从它的本质上来说却更类似于C++......            JAVA事

Red_angelX的专栏 2722
上一篇: c#软件开发学习笔记--委托
下一篇: c#软件开发学习笔记--winform窗体(窗体、事件、常用控件)
Z599817841
博客等级 码龄4年 12粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值