我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】

简介: 我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】

目录

什么是委托?

如何定义和使用委托?

1、声明委托类型

2、实例化委托对象

3、调用委托方法

Hello!大家好!我是努力赚钱买生发水的灰小猿。

“欢迎来到王者荣耀之C#专场”

最近在用C#的委托做开发时,发现委托这个东西实在在深奥,不了解的小伙伴觉得它没有卵用,然而了解的小伙伴却觉得它大有用途,所以今天大灰狼就借助王者荣耀的英雄技能释放机制和大家聊一聊C#中委托的神秘含义...

“干货还有三秒到达战场!”

什么是委托?

委托是C#中的一种构造,比如在C++中有函数指针的概念,允许在运行时选择要调用的函数。虽然C#没有指针,但是C#中委托的作用却和指针类似,在C#中通过使用Delegate类(即委托类),委托实例可以封装属于可调用实例的方法。然后通过委托可以间接的调用一个方法,在委托中包含对方法的引用,使用委托可以在程序运行时动态的设定要调用的方法,所以执行或调用一个委托时,将执行该委托所引用的方法。

在这里要注意一点:“委托类型不是真正的类,它和类存在明显的差异,类可以包含数据,而委托类型包含的只是指向方法的返回类型和参数列表。并且委托类Delegate是密封的,不能从Delegate类中派生委托类型,也不可能从中派生自定义类。”

委托具有以下的特点:

委托类似于C/C++函数指针,但它的安全的
委托允许将方法作为参数进行传递
委托可用于定义回调方法
委托可以将多个方法关联在一起,即可以对一个事件调用多个方法
委托所指向的方法不需要与委托签名精确匹配

如何定义和使用委托?

定义和使用委托有三个步骤,

声明委托类型→实例化委托对象→调用委托方法

1、声明委托类型

声明委托类型的目的是告诉编译器这种类型代表了哪种类型的方法。

声明委托的语法是:

[修饰符]delegate 返回类型 委托类型名 (参数列表);

修饰符为:public、private、protected等

返回类型为:string、double、int等

在声明一个委托类型时,每个委托类型都描述参数的个数和类型,以及它可以引用的方法的返回类型,每当需要一组新的参数类型或返回类型时都必须声明一个新的委托类型。

比如在王者峡谷中每一个英雄都有至少三个技能,那么在我们点击一技能的时候,到底是释放哪个英雄的技能呢?这里就很好的用到了委托,

如下面代码声明了一个委托类型Skill_one_Delegate,用这个委托来表示所有英雄的一技能释放,该委托类型可以引用无参数并返回void的方法。

//定义一个释放一技能的委托类型
public delegate void Skill_one_Delegate();

重点来了!

在这里要注意的一点:在一般情况下,委托类型必须与后面引用的方法具有相同的签名,即委托类型的参数个数、数据类型和顺序以及返回值必须与后面引用的方法一致,否则可能会出现错误!

2、实例化委托对象

在我们声明了委托类型之后,必须创建一个它的实例,即创建委托对象并使之与特定的方法相关联。

也可以说我们是为上面定义的一技能的委托进行实例化并创建特定的方法,在这里我们就可以将每个英雄的一技能作为一个该委托的特定方法。

定义委托对象的语法格式如下:

委托类型名 委托对象名 = new 委托类型名(与之相关联的方法);

如下面我们实例化Skill_one_Delegate委托类型的一个委托对象sOne:

public Skill_one_Delegate sOne; //定义委托对象

另外,委托对象还需要实例化调用的方法,我们为了直观方便起见,通常将这些方法放了一个类中(也可以将这些方法放在程序的Program类中)

现在我们就可以将每个英雄的一技能作为一个方法,将它们全都存放在代表所有英雄一技能的类Skill_one中,如下,我们暂且定义后裔、亚瑟、猴子的一技能在Skill_one类中:

//定义一技能释放类
class Skill_one
{

//后裔一技能
public static void DuoChongJianShi()
{
    Console.WriteLine("多重箭矢");
}

//亚瑟一技能
public static void ShiYueZhiDun()
{
    Console.WriteLine("誓约之盾");
}

//猴子一技能
public static void HuShenZhouFa()
{
    Console.WriteLine("护身咒法");
}

}

当然在真正的游戏中技能的释放不可能是这样输出的,真正的技能释放一定是有一个指向目标的参数的。
3、调用委托方法

在创建委托对象之后,我们通常将委托对象传递给将调用该委托的其他代码,通过委托对象的名称调用委托对象。其使用语法格式如下:

委托对象名(实参列表);

什么意思呢?大灰狼在这里解释一下,因为每一个委托类型都有与其对应的特定的委托方法嘛,所以我们实例化委托类型之后,当然要实现该委托对应的方法,所以我们可以将要调用的方法传递给委托对象,然后直接用委托对象名加括号就可以启用该方法了,emmm...有些绕了。

还拿英雄技能释放来讲,

在刚才我们定义了后裔、亚瑟、猴子三个英雄的一技能作为Skill_one这个委托的特定方法,然而这个委托Skill_one指的就是所有英雄的一技能,现在我们将这个委托类型用sOne这个委托对象来进行实例化,那么应该如何释放技能呢?

我们知道王者荣耀中每一个英雄都有技能一、技能二、技能三、血量、伤害等属性,在这里我们就可以将这些属性定义成委托类型,在释放某个英雄的某个技能时,我们只需要调用该英雄的这一个委托中对应的这个英雄的技能即可,

所以我们现在就定义一个英雄类Hera,在这个类中我们暂且只定义一个一技能的委托,而这个Hera类当然是所有英雄都有的了。

我们现在以释放的后裔的一技能“多重箭矢”为例,那么我们首先应该使用后裔来实例化英雄Hera这个类,

//定义后裔接收英雄类
Hera houyi = new Hera();

然后我们是要释放一技能,那么就调用英雄类中释放一技能的委托,同时在王者荣耀中每个英雄都具有一技能,也就是说在Skill_one这个类中存放了很多个英雄的一技能的方法,那么我们到底调用哪个方法?当然是后裔的DuoChongJianShi()方法了,

所以我们就将Skill_one类中后裔的DuoChongJianShi()方法传递给调用了一技能委托的后裔:

//使用委托方法接收一技能类中该英雄对应的技能
houyi.sOne = Skill_one.DuoChongJianShi;

现在我们完成了后裔一技能的实例化操作,最后就是该技能的释放了,按照委托调用的方法,因为我们已将后裔的一技能传递给后裔的一技能委托,所以我们可以直接调用该委托对象即可:

houyi.sOne(); //释放后裔一技能

结果如下:

最后将完整代码附上,实现分别“释放”后裔、亚瑟、猴子的一技能。

定义一技能释放类:

//定义一技能释放类

class Skill_one
{
    //后裔一技能
    public static void DuoChongJianShi()
    {
        Console.WriteLine("多重箭矢");
    }

    //亚瑟一技能
    public static void ShiYueZhiDun()
    {
        Console.WriteLine("誓约之盾");
    }

    //猴子一技能
    public static void HuShenZhouFa()
    {
        Console.WriteLine("护身咒法");
    }

}

定义释放一技能的委托和英雄类:

//定义一个释放技能的委托

public delegate void Skill_one_Delegate();

//定义英雄类
class Hera
{
    //在英雄类中实例化委托
    public Skill_one_Delegate sOne;
}

主类实现英雄一技能的释放:

class Program

{
    static void Main(string[] args)
    {
        //定义后裔接收英雄类
        Hera houyi = new Hera();
        //使用委托方法接收一技能类中该英雄对应的技能
        houyi.sOne = Skill_one.DuoChongJianShi;

        //定义亚瑟接收英雄类
        Hera yase = new Hera();
        //使用委托方法接收一技能类中该英雄对应的技能
        yase.sOne = Skill_one.ShiYueZhiDun;

        //定义猴子接收英雄类
        Hera houzi = new Hera();
        //使用委托方法接收一技能类中该英雄对应的技能
        houzi.sOne = Skill_one.HuShenZhouFa;        

        houyi.sOne();   //释放后裔一技能
        yase.sOne();   //释放亚瑟一技能
        houzi.sOne();   //释放猴子一技能
    }
}

“释放”结果如下:

好啦,保护我方输出!Victory!!!

觉得不错记得点赞关注大灰狼哟!

大灰狼期待与你一同进步!

目录
相关文章
|
6月前
|
存储 JavaScript C#
ROS CDK魔法书:点亮博客上云新技能(C#篇)
阿里云ROS CDK结合OSS的资源编排教程,教你如何以代码定义云资源,简化部署流程。ROS CDK允许使用编程语言(如TypeScript、C#)代替JSON或YAML模板,创建和管理云资源,如OSS Bucket。通过Asset模块,本地文件被转化为云资源,ROS CDK的`ros-cdk-ossassets`和`ros-cdk-ossdeployment`则负责资源上传和管理。教程以创建和部署博客到OSS为例,展示了从初始化项目、配置凭证到编写CDK代码,再到打包、部署和更新资源栈的全过程。使用ROS CDK,开发者能更高效地实现云上资源的自动化运维和管理。
|
3月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
145 7
|
4月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
72 4
|
4月前
|
C#
C#中的委托(一)
C#中的委托(一)
41 1
|
4月前
|
C# C++
C#语言进阶(一)—委托
C#语言进阶(一)—委托
54 0
|
7月前
|
存储 安全 C#
C# - 委托与事件
这篇文档介绍了C#中的委托和事件。委托是存储方法引用的类型,支持回调、事件处理,具有引用方法、类型安全、多播性等特性,并在异步编程中发挥作用。事件是委托的封装,提供保护和订阅机制,防止外部直接访问。当需要在类内部控制方法调用,防止外部误触发时,可使用事件。
|
6月前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
34 0
|
6月前
|
C#
C#||委托和事件的实例
C#||委托和事件的实例
|
7月前
|
数据采集 数据可视化 搜索推荐
提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票
使用C#和Fizzler库,开发一个多线程爬虫,高效抓取五一假期特价机票信息。通过代理IP规避反爬策略,实现实时数据更新、个性化推送及数据可视化分析。示例代码展示如何配置代理、发送HTTP请求、解析HTML并提取机票详情。注意适应实际环境调整参数。祝编码愉快!
提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票