C# 入门(下)

简介: C# 入门

5、委托的理解


1:委托是一种存储函数引用的类型


2:使用delegate关键字定义委托,同时声明返回类型和参数列表。

namespace test
{
    class Program
    {
        //定义一个委托
        delegate double ProcessEvent(double p1, double p2);
        //委托变量
        static ProcessEvent process;
        static double Add(double p1, double p2) => p1 + p2;
        static double Subtract(double p1, double p2) => p1 - p2;
        static void Main(string[] args)
        {
            Console.WriteLine("Enter 2 numbers:");
            string line = ReadLine();
            int pos = line.IndexOf(',');
            double p1 = ToDouble(line.Substring(0,pos));
            double p2 = ToDouble(line.Substring(pos+1, line.Length - pos - 1));
            Console.WriteLine("Enter type:");
            line = Console.ReadLine();
            if(line == "a")
            {
                //将函数引用赋给委托变量(初始化与委托有相同返回值和参数列表的函数引用.就可以通过该委托变量调用这个函数)
                process += new ProcessEvent(Add);
            }
            else
            {
                process += new ProcessEvent(Subtract);
            }
            //使用该委托调用选择的处理函数
            WriteLine(process(p1, p2));
        }
    }
}


image.png


image.png

6、事件的处理


事件是.NET中最常用的OOP技术。事件类似异常,但是没有try-catch。事件的引发和订阅实际上就是一种委托,事件的处理方法的返回值和参数由委托指定。


C#中事件的编程分为两部分:事件触发、事件的订阅(处理)。而委托就是事件发生方和处理方之间的一个桥梁。


image.png

//申明委托类型
    public delegate void KeyboardHandler(String input);
    //事件发布者
    class Sender
    {
        //事件定义关键字  委托类型  事件名称
        public event KeyboardHandler Keydown;
        public void Run()
        {
            while (true)
            {
                string line = ReadLine();
                //触发事件
                Keydown(line);
            }
        }
    }
    //事件订阅者(多个订阅者可同时订阅一个事件)
    class Process
    {
        public Process(Sender sender)
        {
            //事件的注册(+=将处理程序挂载到事件,-=表示事件卸载处理程序,可添加多个处理函数)
            sender.Keydown += new KeyboardHandler(OnKeyDown);
        }
        //真正的事件处理函数
        private void OnKeyDown(String input)
        {
            WriteLine("Ascii code of Char " + input + " is:"  + (short)(input[0]));
        }
    }
    class Start
    {
        static void Main(string[] args)
        { 
            //实例化事件发送器
            Sender sender = new Sender();
            //实例化事件处理器
            Process process = new Process(sender);
            //启动运行
            sender.Run();
        }
    }


事件注册的具体格式如下:

sender.Keydown += new KeyboardHandler(OnKeyDown);

事件 += new 委托类型(方法标识符);


即如果触发sender对象的Keydown事件,就调用OnKeyDown方法来处理,传递给OnKeyDown的参数取决于委托类型KeyboardHandler定义的参数。


事件的注册还有一种更简洁方式


sender.Keydown += OnKeyDown;


运行结果


image.png


7、Lambda表达式


(未类型化的参数列表)=>C#语句

=>是运算符

上面事件的注册可以用匿名方法或Lambda表达式来改造

public Process(Sender sender)
{
      //事件的注册
      sender.Keydown += new KeyboardHandler(OnKeyDown);
}
//真正的事件处理函数
private void OnKeyDown(String input)
{
      WriteLine("Ascii code of Char " + input + " is:"  + (short)(input[0]));
}


用匿名方法改造

public Process(Sender sender)
{
     sender.Keydown += delegate(string input) 
     {
          WriteLine("Ascii code of Char " + input + " is:" + (short)(input[0]));
     };
}


可以看出OnKeyDown处理函数通过匿名方法形式,对其他应用程序来说是隐藏的,也就是说无法重用这个事件处理函数。


需要注意的一点,匿名方法和委托类型的定义都用到了delegate关键字。


Lambda表达式用于匿名方法

public Process(Sender sender)
{
      //lambda表达式注册及处理事件
      sender.Keydown += (input)=> WriteLine("Ascii code of Char " + input + " is:" + (short)(input[0]));
}


实际上,编译器在提取Lambda表达式时,会创建一个匿名方法。Lambda表达式的参数实际就是用到了前面所说的类型推断来确定参数的类型,也可以指定参数类型。Lambda表达式也可以执行多个语句,可以有返回值。

(param1...paramN) =>
{
    //语句1
    //语句2
    return value;
}


附录一


快捷键

F5:跳转到下一断点

F10:单步调试

“Ctrl +  -” : 返回到上一个光标处

“Ctrl + Shift + - ”:前进到下一个光标位置

····


相关文章
|
7月前
|
存储 编译器 数据处理
C#基础入门之数据类型
C#基础入门之数据类型
|
2月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
73 7
|
2月前
|
C#
C#入门
C#入门
28 0
|
25天前
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
|
2月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
68 8
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
3月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
84 0
|
3月前
|
开发框架 .NET Java
C#/.NET/.NET Core自学入门指南
C#/.NET/.NET Core自学入门指南
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
92 0
|
4月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
381 0