C#学习-刘铁猛

文章目录

    • 1.委托
      • 委托的具体使用-魔板方法
      • 回调方法【好莱坞方法】:通过委托类型的参数,传入主调方法的被调用方法,主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话,如果通过,导演会打电话通知演员。】
      • 同步调用
      • 同步方法;使用委托对三个方法进行间接调用
      • 多播委托,也是同步
      • 使用Thread进行显示异步调用
      • 使用Task进行显式异步调用
      • 使用接口来取代委托
      • C# 中提供的委托,Action和Func
      • P30lambda表达式
      • P29接口,反射,隔离,依赖注入

视频连接

1.委托

委托方法要和委托签名相匹配

// See https://aka.ms/new-console-template for more information
using ConsoleApp1.Model;namespace ConsoleApp1
{public class Program1{static void Main(string[] args) {Calculator calculator = new Calculator();calculator.Report();//直接调用//Action委托Action action = new Action(calculator.Report);action.Invoke(); //使用委托进行间接调用//Function委托Func<double, double, double> func1 = new Func<double, double, double>(calculator.Add);Func<double, double, double> func2 = new Func<double, double, double>(calculator.Sud);double x = 200;double y = 100;double z = 0;z=func1.Invoke(x,y);Console.WriteLine(z);z = func2.Invoke(x, y);Console.WriteLine(z);}}
}

自定义委托方法Calc

// See https://aka.ms/new-console-template for more information
using ConsoleApp1.Model;namespace ConsoleApp1
{public delegate double Calc(double x, double y);public class Program{static void Main(string[] args) {Calculator calculator = new Calculator();//委托的具体方法需要与委托的签名相匹配Calc calc1 = new Calc(calculator.Add);Calc calc2 = new Calc(calculator.Sud);double x = 1.12;double y = 2.23;double res1=calc1(x,y);double res2 = calc2(x, y);Console.WriteLine(res1);Console.WriteLine(res2);}}
}

在这里插入图片描述

委托的具体使用-魔板方法

// See https://aka.ms/new-console-template for more information
using ConsoleApp1.Model;namespace ConsoleApp1
{public class Program{static void Main(string[] args) {Productfactory productfactory = new Productfactory();WrapFactory wrapFactory = new WrapFactory();//创建委托实例Func<Product> func1 = new Func<Product>(productfactory.MakePizza);Func<Product> func2 = new Func<Product>(productfactory.MakeToyCar);Box box1 = wrapFactory.WrapProduct(func1);Box box2 = wrapFactory.WrapProduct(func2);Console.WriteLine(box1.Product.Name);Console.WriteLine(box2.Product.Name);}}class Product {public string Name{get;set;}}class Box{public Product Product { get; set; }}class WrapFactory {//魔板方法,大部分逻辑已经固定public Box WrapProduct(Func<Product> getProduct) {Box box = new Box();Product product= getProduct.Invoke();box.Product = product;return box;}}class Productfactory {public Product MakePizza() { Product product = new Product();product.Name = "pizza";return product;}public Product MakeToyCar(){Product product = new Product();product.Name = "Toy Car";return product;}}
}

回调方法【好莱坞方法】:通过委托类型的参数,传入主调方法的被调用方法,主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话,如果通过,导演会打电话通知演员。】

// See https://aka.ms/new-console-template for more information
using ConsoleApp1.Model;namespace ConsoleApp1
{public class Program{static void Main(string[] args) {Productfactory productfactory = new Productfactory();WrapFactory wrapFactory = new WrapFactory();//创建委托实例Func<Product> func1 = new Func<Product>(productfactory.MakePizza);Func<Product> func2 = new Func<Product>(productfactory.MakeToyCar);//创建委托实例Logger logger = new Logger();   Action<Product> log = new Action<Product>(logger.Log);Box box1 = wrapFactory.WrapProduct(func1, log);Box box2 = wrapFactory.WrapProduct(func2, log);Console.WriteLine(box1.Product.Name);Console.WriteLine(box2.Product.Name);}}class Logger {public void Log(Product product) {Console.WriteLine("Product'{0}' is created at{1},price is '{2}'", product.Name,DateTime.UtcNow,product.Price);//不带时区的时间}}class Product {public string Name{get;set;}public double Price{get;set;} }class Box{public Product Product { get; set; }}class WrapFactory {public Box WrapProduct(Func<Product> getProduct,Action<Product> logCallback) {Box box = new Box();Product product= getProduct.Invoke();if (product.Price>50) {logCallback(product);}box.Product = product;return box;}}class Productfactory {public Product MakePizza() { Product product = new Product();product.Name = "pizza";product.Price = 20;return product;}public Product MakeToyCar(){Product product = new Product();product.Name = "Toy Car";product.Price =100;return product;}}
}

在这里插入图片描述

同步调用

// See https://aka.ms/new-console-template for more information
using ConsoleApp1.Model;
using System.ComponentModel;namespace ConsoleApp1
{public class Program{static void Main(string[] args){Student1 student1 = new Student1() {ID=1,PenColor=ConsoleColor.Yellow };Student1 student2 = new Student1() { ID =2, PenColor = ConsoleColor.Blue };Student1 student3 = new Student1() { ID =3, PenColor = ConsoleColor.Green };student1.DoWork();student2.DoWork();student3.DoWork();for (int i=0;i<10 ;i++) {Console.ForegroundColor = ConsoleColor.Cyan;Console.WriteLine("Main thread is working {0} hour.",i);Thread.Sleep(1000); }}}class Student1 {public string Name { get; set; }public int ID { get; set; }public ConsoleColor PenColor { get; set; }public void DoWork() {for (int i = 0; i < 4; i++){Console.ForegroundColor = PenColor;Console.WriteLine("ID is {0} thread is working----{1}hour.", ID,i);Thread.Sleep(1000);}}}}

同步方法;使用委托对三个方法进行间接调用

            Student1 student1 = new Student1() {ID=1,PenColor=ConsoleColor.Yellow };Student1 student2 = new Student1() { ID =2, PenColor = ConsoleColor.Blue };Student1 student3 = new Student1() { ID =3, PenColor = ConsoleColor.Green };Action action1 = new Action(student1.DoWork);Action action2 = new Action(student2.DoWork);Action action3 = new Action(student3.DoWork);action1.Invoke();action2.Invoke();action3.Invoke();

多播委托,也是同步

            Action action1 = new Action(student1.DoWork);Action action2 = new Action(student2.DoWork);Action action3 = new Action(student3.DoWork);action1+=action2;action1+=action3;action1.Invoke();

委托-使用委托可以进行隐式的异步调用。

使用Task.Run(() => action1.Invoke());代替原来的BeginInvoke方法。

// See https://aka.ms/new-console-template for more information
using ConsoleApp1.Model;
using System.ComponentModel;namespace ConsoleApp1
{public class Program{static void Main(string[] args){Student1 student1 = new Student1() {ID=1,PenColor=ConsoleColor.Yellow };Student1 student2 = new Student1() { ID =2, PenColor = ConsoleColor.Blue };Student1 student3 = new Student1() { ID =3, PenColor = ConsoleColor.Green };Action action1 = new Action(student1.DoWork);Action action2 = new Action(student2.DoWork);Action action3 = new Action(student3.DoWork);//action1.BeginInvoke(null,null);var task1=Task.Run(() => action1.Invoke());//  Console.WriteLine($"task1-action1------>{task1}");var task2 = Task.Run(() => action2.Invoke());// Console.WriteLine($"task2-action2----->{task2}");var task3 = Task.Run(() => action3.Invoke());//  Console.WriteLine($"task3-action3----->{task3}");for (int i=0;i<10 ;i++) {Console.ForegroundColor = ConsoleColor.Cyan;Console.WriteLine("Main thread is working {0} hour.",i);Thread.Sleep(1000); }}}class Student1 {public string Name { get; set; }public int ID { get; set; }public ConsoleColor PenColor { get; set; }public void DoWork() {for (int i = 0; i < 4; i++){Console.ForegroundColor = PenColor;Console.WriteLine("Student  {0} thread is working----{1}hour.", ID,i);Thread.Sleep(1000);}}}}

使用Thread进行显示异步调用

在这里插入图片描述

        static void Main(string[] args){Student1 student1 = new Student1() {ID=1,PenColor=ConsoleColor.Yellow };Student1 student2 = new Student1() { ID =2, PenColor = ConsoleColor.Blue };Student1 student3 = new Student1() { ID =3, PenColor = ConsoleColor.Green };//使用Thread进行显示异步调用Thread t1 = new Thread(new ThreadStart(student1.DoWork));Thread t2 = new Thread(new ThreadStart(student2.DoWork));Thread t3 = new Thread(new ThreadStart(student3.DoWork));t1.Start();t2.Start(); t3.Start();for (int i=0;i<10 ;i++) {Console.ForegroundColor = ConsoleColor.Cyan;Console.WriteLine("Main thread is working {0} hour.",i);Thread.Sleep(1000); }}

使用Task进行显式异步调用

在这里插入图片描述
在这里插入图片描述

            //使用Task行显示异步调用Task task1 = new Task(new Action(student1.DoWork));Task task2 = new Task(new Action(student2.DoWork));Task task3 = new Task(new Action(student3.DoWork));task1.Start();task2.Start();  task3.Start();

主线程和分支线程,互不等待,发生资源上的争抢。

使用接口来取代委托

// See https://aka.ms/new-console-template for more information
using ConsoleApp1.Model;
using System.ComponentModel;namespace ConsoleApp1
{//用接口代替委托public class Program{static void Main(string[] args){IProductfactory Pizzafactory = new Pizzafactory();IProductfactory Toycarfactory = new ToyCarfactory();//包装工厂生产盒子WrapFactory wrapFactory = new WrapFactory();Box pizzaBox=wrapFactory.WrapProduct(Pizzafactory);Box totcarBox = wrapFactory.WrapProduct(Toycarfactory);Console.WriteLine(pizzaBox.Product.Name);Console.WriteLine(totcarBox.Product.Name);}}interface IProductfactory {Product Make();}class Pizzafactory : IProductfactory{public Product Make(){Product product = new Product();product.Name = "pizza";return product;}}class ToyCarfactory : IProductfactory{public Product Make(){Product product = new Product();product.Name = "Toy Car";return product;}}//上面是新定义的两个工厂ToyCarfactory 和Pizzafactory class Product{public string Name { get; set; }public double Price { get; set; }}class Box{public Product Product { get; set; }}class WrapFactory{public Box WrapProduct(IProductfactory productfactory)//不需要委托类型的参数,工厂类型的参数即可{Box box = new Box();Product product = productfactory.Make();box.Product = product;return box;}}//下面的这个class Productfactory可以不不需要了class Productfactory{public Product MakePizza(){Product product = new Product();product.Name = "pizza";product.Price = 20;return product;}public Product MakeToyCar(){Product product = new Product();product.Name = "Toy Car";product.Price = 100;return product;}}
}

在这里插入图片描述

C# 中提供的委托,Action和Func

Action适用于没有返回值的委托,Func适用于有返回值的委托。
可以使用var关键字缩短代码
用var action=new Action<string,int>(SayHello);代替Action<string,int> action=new Action<string,int>(SayHello);
Func适用于有返回值的委托

static void Main(string[] args){Func<int,int,int> myFunc=new Func<int,int,int>(Add);int res =myFunc(4,5);Console.WriteLine(res);
}static int Add(int a,int b){return a+b;
}
}

Action适用于没有返回值的委托,

static void Main(string[] args){Action action=new Action<string,int>(SayHello);action("Tim",3);
}static void SayHello(string name,int round){for(int i=0;i<round;i++){Console.WriteLine($"Helo {name}!");
}
}

P30lambda表达式

(int a, int b) => { return a + b; }

        static void Main(string[] args){//lambda表达式,匿名的// Func<int, int, int> func = new Func<int, int, int>((int a, int b) => { return a + b; });//lambda表达式,委托时简写Func<int, int, int> func = (int a, int b) => { return a + b; };int res=func(1, 2);Console.WriteLine(res);func = new Func<int, int, int>((int a, int b) => { return a *b; });int res2 = func(1, 2);Console.WriteLine(res2);}

//lambda表达式,委托时简写,把lambda表达式赋值给委托类型的变量。
Func<int, int, int> func = (int a, int b) => { return a + b; };
泛型委托的类型推断

   public class Program{static void Main(string[] args){DoSomeCalc((a, b) => { return a + b; },1,2);Console.WriteLine("handle result!");}static void DoSomeCalc<T>(Func<T,T,T>func,T x,T y) {T res=  func(x, y);Console.WriteLine(res);}}

P29接口,反射,隔离,依赖注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/378886.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 完整工程&a…

vue、js截取视频任意一帧图片

html有本地上传替换部分&#xff0c;可以不看 原理&#xff1a;通过video标签对视频进行加载&#xff0c;随后使用canvas对截取的视频帧生成需要的图片 <template> <el-row :gutter"18" class"preview-video"><h4>视频预览<span&…

【概率论三】参数估计:点估计(矩估计、极大似然法)、区间估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法2.1. 似然函数2.2. 极大似然估计法 3. 评价估计量的标准3.1. 无偏性3.2. 有效性3.3. 一致性 二. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估…

[iOS]浅析isa指针

[iOS]浅析isa指针 文章目录 [iOS]浅析isa指针isa指针isa的结构isa的初始化注意事项 上一篇留的悬念不止分类的实现 还有isa指针到底是什么 它是怎么工作的 class方法又是怎么运作的 class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 这里面的class又是何方…

新华三H3CNE网络工程师认证—VLAN使用场景与原理

通过华三的技术原理与VLAN配置来学习&#xff0c;首先介绍VLAN&#xff0c;然后介绍VLAN的基本原理&#xff0c;最后介绍VLAN的基本配置。 一、传统以太网问题 在传统网络中&#xff0c;交换机的数量足够多就会出现问题&#xff0c;广播域变得很大&#xff0c;分割广播域需要…

R语言优雅的把数据基线表(表一)导出到word

基线表&#xff08;Baseline Table&#xff09;是医学研究中常用的一种数据表格&#xff0c;用于在研究开始时呈现参与者的初始特征和状态。这些特征通常包括人口统计学数据、健康状况和疾病史、临床指标、实验室检测、生活方式、社会经济等。 本人在既往文章《scitb包1.6版本发…

C++客户端Qt开发——QT初识

二、QT初识 1.helloworld示例 ①图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示helloworld 右侧通过树形结构&#xff0c;就会显示出当前界面上有哪些控件 此时.ui文件已发生变化 qmake就会在编译项目的时候&#xff0c;基于这个内容&#xff0c;生成一段C…

35.UART(通用异步收发传输器)-RS232(2)

&#xff08;1&#xff09;RS232接收模块visio框图&#xff1a; &#xff08;2&#xff09;接收模块Verilog代码编写: /* 常见波特率&#xff1a; 4800、9600、14400、115200 在系统时钟为50MHz时&#xff0c;对应计数为&#xff1a; (1/4800) * 10^9 /20 -1 10416 …

链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外

因为上一篇没对微服务代码很详细地说明&#xff0c;所以在此借花献佛&#xff0c;使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目&#xff0c;fork到github以及gitee中&#xff0c;然后拉取到本地 后端代码&#xff1a; https://gitee.com/jelex/mall-swarm.gi…

微软研究人员为电子表格应用开发了专用人工智能LLM

微软的 Copilot 生成式人工智能助手现已成为该公司许多软件应用程序的一部分。其中包括 Excel 电子表格应用程序&#xff0c;用户可以在其中输入文本提示来帮助处理某些选项。微软的一组研究人员一直在研究一种新的人工智能大型语言模型&#xff0c;这种模型是专门为 Excel、Go…

BiLSTM 实现股票多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

算法题目整合

文章目录 121. 小红的区间翻转142. 两个字符串的最小 ASCII 删除总和143. 最长同值路径139.完美数140. 可爱串141. 好二叉树 121. 小红的区间翻转 小红拿到了两个长度为 n 的数组 a 和 b&#xff0c;她仅可以执行一次以下翻转操作&#xff1a;选择a数组中的一个区间[i, j]&…

SpringBoot集成MQTT实现交互服务通信

引言 本文是springboot集成mqtt的一个实战案例。 gitee代码库地址&#xff1a;源码地址 一、什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&…

教大模型学数学,总共分几步?

大模型那么聪明&#xff0c;为什么数学题总是做不对、做不会&#xff1f; 从答高考数学卷难及格到普通数字比大小出错&#xff0c;大模型总算让大家觉得并非“无所不能”。这一方面让普通人开心&#xff0c;毕竟讲到AI取代人类看起来为时尚早&#xff0c;而另一方面&#xff0…

Autosar RTE配置-Assembly和Delegation的使用-基于ETAS软件

文章目录 前言Assembly和Delegation的含义Delegation的使用Assembly的使用总结 前言 RTE中的Compostion内部的SWC之间的连接使用Assembly Connector进行连接。这样的连接一般都是一个SWC的Pport对应另一个SWC的Rport。而Autosar软件中往往不只一个Composition(一般可以以核的数…

Android Toast

Toast Toast是Android常用的简单控件&#xff0c;主要用来进行简短的信息提示&#xff0c;如图1所示。 图1 Toast效果图 Toast的基本用法很简单&#xff0c;不需要设置layout&#xff0c;只需要在程序中调用即可。Toast调用makeText()方法设置需要显示的界面、显示的内容、显…

【计算机网络】学习指南及导论

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️计算机网络】 文章目录 前言我们为什么要学计算机网络&#xff1f;计算机网络概述计算机网络的分类按交换技术分类按使用者分类按传输介质分类按覆盖网络分类按覆盖网络分类 局域网的连接方式有线连接…

Lua基础知识入门

1 基础知识 标识符&#xff1a;标识符的定义和 C语言相同&#xff1a;字母和下划线_ 开头&#xff0c; 下划线_ 大写字母一般是lua保留字&#xff0c; 如_VERSION 全局变量&#xff1a;默认情况下&#xff0c;变量总是认为是全局的&#xff0c;不需要申明&#xff0c;给一个变…

河南萌新联赛2024第(一)场:河南农业大学

A.造数 题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/86639/A 思路&#xff1a; 签到题&#xff0c;特判如果n0&#xff0c;输出0&#xff0c;如果n1或2&#xff0c;输出1&#xff1b;while循环&#xff0c;首先如果n%2!0&#xff0c;那么s&…

基于Web的特产美食销售系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…