当前位置: 首页 > news >正文

C#学习笔记

一、事件派发器

在C#中,事件派发器通常是指事件委托和事件处理程序的组合,用于实现一种观察者设计模式。它允许对象在状态发生变化时通知其他对象,从而实现对象之间的解耦。

事件派发器的基本组成部分:

事件委托(Event Delegate): 事件委托是一种特殊的委托,用于封装可以被调用的方法。它定义了事件的签名,即指定了事件处理程序方法的参数和返回类型。通常,事件委托声明在事件派发器类的外部,并且使用 delegate 关键字来定义。例如:

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

事件(Event): 事件是事件委托的实例,它提供了一种触发事件和订阅事件的机制。在事件派发器类中声明事件,其他类可以通过订阅该事件来注册事件处理程序。事件通常使用event关键字声明。例如:

public event MyEventHandler MyEvent;

事件处理程序(Event Handler): 事件处理程序是一个方法,用于响应事件的发生。它必须具有与事件委托相同的签名。当事件被触发时,与该事件关联的事件处理程序将被调用。例如:

public void MyEventHandlerMethod(object sender, EventArgs e) 

{

//其他逻辑

}

事件触发器(Event Trigger): 事件触发器是事件派发器类中的方法,用于触发事件。当某些条件满足时,调用事件触发器方法将会触发事件,从而执行与事件关联的事件处理程序。通常,事件触发器方法使用protected 或protected virtual修饰,以便子类可以重写它。例如:

protected virtual void OnMyEvent(EventArgs e)

{

MyEvent?.Invoke(this, e);

}

Invoke 方法用于触发事件,它的第一个参数是事件的发布者(通常是 this ,表示当前对象),第二个参数是一个包含事件信息的EventArgs 对象e。

示例:假设我们有一个游戏中的角色类 Player,我们想要在角色受到伤害时触发一个事件来通知其他对象,比如显示受伤效果或更新 UI。

首先,定义一个事件委托和一个事件:

using System;

public class Player
{
    // 事件委托
    public delegate void DamageEventHandler(int damageAmount); 

   // 事件
    public event DamageEventHandler Damaged;
    // 触发受伤事件的方法
    public void TakeDamage(int damageAmount)
    {
    //触发受伤事件
        OnDamaged(damageAmount);
    }
    //触发事件的方法
    protected virtual void OnDamaged(int damageAmount)
    {
     //检查事件是否有订阅者,如果有则调用事件处理程序
        Damaged?.Invoke(damageAmount);
    }
}
在这个例子中,DamageEventHandler 是一个事件委托,定义了一个受伤事件的签名,即参数为受到的伤害值。Damaged 是一个事件,它使用了 DamageEventHandler 委托。

再创建一个订阅事件的类 DamageEffect,用于处理角色受到伤害时的效果:

using System;

public class DamageEffect
{
    // 受伤事件处理程序
    public void OnPlayerDamaged(int damageAmount)
    {
        Console.WriteLine("角色受到伤害的效果");
    }
}

最后,创建一个 Main 方法来模拟游戏的运行过程,并进行事件的订阅和触发:

class Program
{
    static void Main(string[] args)
    {
        Player player = new Player();
        DamageEffect damageEffect = new DamageEffect(); 
        player.Damaged += damageEffect.OnPlayerDamaged;// 订阅事件
        player.TakeDamage(20); // 触发事件
    }
}

在Main方法中,创建了 Player 和 DamageEffect 的实例,并将 DamageEffect 的QnPlayerDamaged 方法订阅到了 Player 的 Damaged 事件上。

然后,通过调用 TakeDamage 方法来模拟角色受到了20点伤害,这将触发Damaged事件,最终调用 QnPlayerDamaged 方法,显示了受伤效果并输出了相应的信息。这是因为通常在 C# 中,事件可以被订阅,而当事件被触发时,所有订阅了该事件的方法都会被调用。

二、定时器

C#中的四种常用的定时器:

1. System.Windows.Forms.Timer

System.Windows.Forms.Timer是Windows窗体应用程序中常用的定时器。它是基于消息循环的,工作在UI线程上,并且适用于Windows窗体应用程序的GUI更新。

示例:

using System;
using System.Windows.Forms;

public class MyForm : Form
{
    private Timer timer;

    public MyForm()
    {
        timer = new Timer();
        timer.Interval = 1000; // 每秒触发一次
        timer.Tick += Timer_Tick; // 订阅 Tick 事件
        timer.Start(); // 启动定时器
    }

    private void Timer_Tick(object sender, EventArgs e)
    {

        Console.WriteLine("计时器触发时间: " + DateTime.Now);
    }
}
2. System.Threading.Timer

System.Threading.Timer是在.NET中常用的多线程环境下的定时器。它是基于线程池的,可以在一个独立的线程中触发回调函数。

示例:

using System;
using System.Threading;

public class MyTimer
{
    private Timer timer;

    public MyTimer()
    {
        timer = new Timer(TimerCallback, null, 0, 1000); // 每秒触发一次
    }

    private void TimerCallback(object state)
    {
        Console.WriteLine("计时器触发时间: " + DateTime.Now);
    }
}

3. System.Timers.Timer

System.Timers.Timer是在.NET中常用的定时器,类似于`System.Threading.Timer,但是它更适合于在单线程环境下使用,例如Windows服务等。

示例:

using System;
using System.Timers;

public class MyTimer
{
    private Timer timer;

    public MyTimer()
    {
        timer = new Timer(1000); // 每秒触发一次
        timer.Elapsed += Timer_Elapsed; // 订阅 Elapsed 事件
        timer.Start(); // 启动定时器
    }

    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("计时器触发时间: " + DateTime.Now);
    }
}

4. System.Windows.Threading.DispatcherTimer

System.Windows.Threading.DispatcherTimer是用于WPF应用程序的定时器,它与System.Windows.Forms.Timer类似,但是工作在WPF 的UI线程上。

示例:

using System;
using System.Windows.Threading;

public class MyViewModel
{
    private DispatcherTimer timer;

    public MyViewModel()
    {
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1); // 每秒触发一次
        timer.Tick += Timer_Tick; // 订阅 Tick 事件
        timer.Start(); // 启动定时器
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        Console.WriteLine("计时器触发时间: " + DateTime.Now);
    }
}
 

相关文章:

C#学习笔记

一、事件派发器 在C#中,事件派发器通常是指事件委托和事件处理程序的组合,用于实现一种观察者设计模式。它允许对象在状态发生变化时通知其他对象,从而实现对象之间的解耦。 事件派发器的基本组成部分: 事件委托(Ev…...

【A-006】基于SSH的新闻发布系统(含论文)

【A-006】基于SSH的新闻发布系统(含论文) 开发环境: Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库: MySQL 技术: SpringStruts2HiberanteJSPJquery 适用于: 课程设计,毕业设计&…...

c语言-static

static作用&#xff1a;修饰变量和函数 修饰局部变量-静态局部变量 static未修饰局部变量 #include <stdio.h>void print() {int a 0;a;printf("%d ", a); }int main() {int i 0;for (i 0; i < 10; i){print();}return 0; }运行结果 static修饰局部变…...

zuul的性能调优

文章目录 zuul的性能调优Zuul参数剖析semaphore(信号量)ribbonhystrix高并发下常见Zuul异常熔断 zuul 1.x 与2.x的区别与总结 zuul的性能调优 在项目实践中&#xff0c;使用jemeter多线程并发访问微服务中的接口时候&#xff0c;在Zuul层出现异常、超时等&#xff0c;从而导致整…...

C++中的动态内存管理

1.C中动态内存管理 C语言内存管理方式在C中可以继续使用&#xff0c;但有些地方就无能为力&#xff0c;而且使用起来比较麻烦&#xff0c;因此C又提出了自己的内存管理方式&#xff1a;通过new和delete操作符进行动态内存管理。 1.1 new/delete操作内置类型 c语言和c的动态内存…...

es6的核心语法

在学习低代码时&#xff0c;经常有粉丝会问&#xff0c;低代码需要什么基础&#xff0c;es6就是基础中的一项。我们本篇是做一个扫盲&#xff0c;可以让你对基础有一个概要性的了解&#xff0c;具体的每个知识点可以深入进行了解&#xff0c;再结合官方模板就会有一个不错的掌握…...

Unity | 射线检测及EventSystem总结

目录 一、知识概述 1.Input.mousePosition 2.Camera.ScreenToWorldPoint 3.Camera.ScreenPointToRay 4.Physics2D.Raycast 二、射线相关 1.3D&#xff08;包括UI&#xff09;、射线与ScreenPointToRay 2.3D&#xff08;包括UI&#xff09;、射线与ScreenToWorldPoint …...

职业经验 2024 年测试求职手册

原贴地址: 2024 年测试求职手册 TesterHome 经历年前年后差不多 2 个月左右时候的求职&#xff0c;是时候总结复盘一下了&#xff0c;本打算在自己有着落再复盘&#xff0c;但是一想那时候似乎价值就没现在去做显得有意义一些&#xff0c;这篇帖子更多的是让大家看下有没有心…...

Spring Boot与Redis深度整合:实战指南

Spring Boot 整合 Redis 相当简单&#xff0c;它利用了 Spring Data Redis 项目&#xff0c;使得我们可以在 Spring Boot 应用中轻松地操作 Redis。以下是如何整合 Redis 到 Spring Boot 应用的基本步骤&#xff1a; 1. 添加依赖 首先&#xff0c;在你的 pom.xml 文件中添加 …...

微服务(基础篇-006-Docker安装-CentOS7)

目录 05-初识Docker-Docker的安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p46&spm_id_frompageDriver&vd_source60a35a11f813c6dff0b76089e5e138cc 0.安装Docker 1.CentOS安装Docker 1.1.卸载&#xff08;可选&#xff09; 1.2.安装dock…...

前端-css-01

1.CSS 长度单位和颜色设置 1.1CSS 中的长度单位 px 像素 em 字体大小的倍数&#xff08;字体默认是16px&#xff09; % 百分比 1.2CSS 中的颜色设置方式 1.2.1使用颜色名表示颜色 red、orange、yellow、green、cyan、blue、purple、pink、deeppink、skyblue、greenyellow .…...

Java学习36-Java 多线程安全:懒汉式和饿汉式

JAVA种有两种保证线程安全的方式&#xff0c;分别叫懒汉式Lazy Initialization和饿汉式Eager Initialization&#xff0c;以下是他们的区别&#xff1a; 线程安全性&#xff1a; 懒汉式本身是非线程安全的&#xff0c;因为多个线程可能同时检查实例是否为null&#xff0c;并尝…...

sql常用之CASE WHEN THEN

sql常用之CASE WHEN THEN SQL中的 CASE 类似编程语言里的 if-then-else 语句&#xff0c;用做逻辑判断。可以用于SELECT语句中&#xff0c;也可以用在WHERE&#xff0c;GROUP BY 和 ORDER BY 子句&#xff1b;可以单独使用&#xff0c;也可以和聚合函数结合使用。 语法&#…...

【PduR路由】IPduM模块详细介绍

目录 1.IpduM功能简介 2.IpduM模块依赖的其他模块 2.1RTE (BSW Scheduler) 2.2PDU Router 2.3COM 3.IpduM功能详解 3.1 功能概述 3.2 I-PDU多路复用I-PDU Multiplexing 3.2.1 Definitions and Layout 3.2.2通用功能描述 General 3.2.3模块初始化 Initialization 3.…...

【MySQL】6.MySQL主从复制和读写分离

主从复制 主从复制与读写分离 通常数据库的读/写都在同一个数据库服务器中进行&#xff1b; 但这样在安全性、高可用性和高并发等各个方面无法满足生产环境的实际需求&#xff1b; 因此&#xff0c;通过主从复制的方式同步数据&#xff0c;再通过读写分离提升数据库的并发负载…...

Lucene及概念介绍

Lucene及概念介绍 基础概念倒排索引索引合并分析查询语句的构成 基础概念 Document&#xff1a;我们一次查询或更新的载体&#xff0c;对比于实体类 Field&#xff1a;字段&#xff0c;是key-value格式的数据&#xff0c;对比实体类的字段 Item&#xff1a;一个单词&#xff0…...

密码算法概论

基本概念 什么是密码学&#xff1f; 简单来说&#xff0c;密码学就是研究编制密码和破译密码的技术科学 例题&#xff1a; 密码学的三个阶段 古代到1949年&#xff1a;具有艺术性的科学1949到1975年&#xff1a;IBM制定了加密标准DES1976至今&#xff1a;1976年开创了公钥密…...

实时数仓之实时数仓架构(Hudi)

目前比较流行的实时数仓架构有两类&#xff0c;其中一类是以FlinkDoris为核心的实时数仓架构方案&#xff1b;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍&#xff0c;这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…...

2022-04-15_for循环等_作业

for循环 编写程序数一下 1到 100 的所有整数中出现多少个数字9计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值&#xff0c;打印出结果求10 个整数中最大值在屏幕上输出9*9乘法口诀表二分查找 编写程序数一下 1到 100 的所有整数中出现多少个数字9 #include <stdio.h>in…...

脑机辅助推导算法

目录 一&#xff0c;背景 二&#xff0c;华容道中道 1&#xff0c;问题 2&#xff0c;告诉脑机如何编码一个正方形格子 3&#xff0c;让脑机汇总信息 4&#xff0c;观察图&#xff0c;得到启发式算法 5&#xff0c;根据启发式算法求出具体解 6&#xff0c;可视化 一&am…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...