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://xiahunao.cn/news/3247941.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

请你谈谈:spring bean的生命周期 - 阶段2:Bean实例化阶段

在Spring框架中&#xff0c;Bean的实例化是Bean生命周期中的一个重要阶段。这个过程包括两个关键的子阶段&#xff1a;Bean实例化前阶段和Bean实例化阶段本身。 BeanFactoryPostProcessor&#xff1a;BeanFactoryPostProcessor是容器启动阶段Spring提供的一个扩展点&#xff0…

智慧城市遐想

很少有人会考虑自己居住的地方。我的意思是真正考虑效率、经济、美观和标准。我们甚至很少抬起头,将目光从智能手机上移开,去欣赏风景或享受城市风光。而且通常这是有道理的。 往日之城 过去,城市建在水源旁,距离河流或湖泊不超过一英里,这样才可以供水。现在,夜间飞越…

海豚调度器(DolphinScheduler)集群搭建详细笔记

海豚调度器集群搭建笔记 1.DolphinScheduler Cluster部署1.1 集群部署规划1.2 集群准备工作1.3 初始化数据库1.4 修改安装环境配置1.5 安装DolphinScheduler1.6 启停命令1.7 登录 DolphinScheduler UI 1.DolphinScheduler Cluster部署 分布式去中心化易扩展的工作流任务调度系…

中国机器视觉行业上市公司市场竞争格局分析

中国机器视觉产业上市公司汇总&#xff1a;分布在各产业链环节 机器视觉就是用机器来代替人眼做测量和判断的系统&#xff0c;机器检测相较于人工视觉检测优势明显。目前&#xff0c;我国机器视觉产业的上市公司数量较多&#xff0c;分布在各产业链环节。具体包括&#xff1a;…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 配置篇 -- flash的使用 --(八)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

ClickHouse集成LDAP实现简单的用户认证

1.这里我的ldap安装的是docker版的 docker安装的化就yum就好了 sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl start docker 使用下面的命令验证sudo docker run hello-world docker pull osixia/openl…

RK3568笔记三十九:多个LED驱动开发测试(设备树)

若该文为原创文章&#xff0c;转载请注明原文出处。 通过设备树配置一个节点下两个子节点控制两个IO口&#xff0c;一个板载LED&#xff0c;一个外接LED。 一、介绍 通过学习设备树控制GPIO&#xff0c;发现有多种方式 一、直接通过寄存器控制 二、通过设备树&#xff0c;但…

windows和linux的等保加固测评的经验分享

一头等保加固测评的牛马&#xff0c;需要能做到一下午测评n个服务器 接下来就讲讲如何当一头xxxxxxxxx》严肃的等保测评加固的经验分享&#xff08; 一、window等保 首先你要自己按着教程在虚拟机做过一遍&#xff08;win2012和win2008都做过一遍&#xff0c;大概windows的…

MATLAB科研数据可视化教程

原文链接&#xff1a;MATLAB科研数据可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247609462&idx3&snf7043936fc5ee42b833c7c9f3bcd24ba&chksmfa826d91cdf5e4872eb275e5319b66ba6927ea0074fb2293fe1ca47d6aedf38ab91050be484c&token1551213…

【大模型】FAISS向量数据库记录:从基础搭建到实战操作

文章目录 文章简介Embedding模型BGE-M3 模型亮点 FAISS是什么FAISS实战安装faiss加载Embedding模型创建FAISS数据库搜索FAISS数据删除FAISS数据保存、加载FAISS索引 总结 本人数据分析领域的从业者&#xff0c;拥有专业背景和能力&#xff0c;可以为您的数据采集、数据挖掘和数…

1.厦门面试

1.Vue的生命周期阶段 vue生命周期分为四个阶段 第一阶段&#xff08;创建阶段&#xff09;&#xff1a;beforeCreate&#xff0c;created 第二阶段&#xff08;挂载阶段&#xff09;&#xff1a;beforeMount&#xff08;render&#xff09;&#xff0c;mounted 第三阶段&#…

数据库管理的艺术(MySQL):DDL、DML、DQL、DCL及TPL的实战应用(上:数据定义与控制)

文章目录 DDL数据定义语言1、创建数据库2、创建表3、修改表结构4、删除5、数据类型 列的约束主键约束&#xff08;primary key&#xff09;唯一约束&#xff08;unique key&#xff09;非空约束检查约束&#xff08;check&#xff09;外键约束&#xff08;foreign key&#xff…

【java】力扣 合法分割的最小下标

文章目录 题目链接题目描述思路代码 题目链接 2780.合法分割的最小下标 题目描述 思路 这道题是摩尔算法的一种扩展 我们先可以找到候选人出来&#xff0c;然后去计算他在左右两边元素出现的次数&#xff0c;只有当他左边时&#xff0c;左边出现的次数2 >左边的长度&…

在pycharm 2023.2.1中运行由R语言编写的ipynb文件

在pycharm 2023.2.1中运行由R语言编写的ipynb文件 背景与目标&#xff1a; 项目中包含由R语言编写的ipynb文件&#xff0c;希望能在pycharm中运行该ipynb文件。 最终实现情况&#xff1a; 未能直接在pycharm中运行该ipynb文件&#xff0c;但是替代的实现方法有&#xff1a;…

基于 Web 的家校联系系统的设计与实现

目录 基于 Web 的家校联系系统的设计与实现 一、绪论 &#xff08;一&#xff09;研究背景 &#xff08;二&#xff09; 研究目的 &#xff08;三&#xff09; 研究意义 二、需求分析 &#xff08;一&#xff09; 功能需求 &#xff08;二&#xff09; 性能需求 &#…

物联网实训室的核心功能有哪些?

随着物联网技术的迅猛发展和广泛应用&#xff0c;唯众凭借其深厚的技术积累和丰富的行业经验&#xff0c;为职业院校提供了全面的物联网实训室解决方案。这些实训室不仅为学生提供了真实、实用、创新的实践环境&#xff0c;还促进了产学研用的深度融合&#xff0c;推动了物联网…

智能锁赛道内卷加剧,磐金锁王42年来行稳致远,底气何在?

中国智能门锁市场正处于一个快速发展的黄金阶段&#xff0c;呈现出了前所未有的繁荣。奥维云网&#xff08;AVC&#xff09;的线上推总数据显示&#xff0c;2024年1-5月&#xff0c;中国家用智能门锁线上市场推总销量规模为274.3万套&#xff0c;同比增长28.3%&#xff1b;推总…

前端基础之Grid布局

【图书推荐】《HTML5CSS3 Web前端开发与实例教程&#xff08;微课视频版&#xff09;》-CSDN博客 Grid布局概述 Grid布局又称为网格布局&#xff08;Grid Layout&#xff09;&#xff0c;是一种现代且功能极为强大的二维网页布局系统。它将容器划分为行和列&#xff0c;产生单…

71.PLC Settings for OPCSERVER(KEPWare)- SAP ME实施

目录 0.目的 1.三菱PLCMitsubishi Ethernet 1.1 型号FX-3U的配置 选择Operational settings 按下图设置通讯参数 选择Open settings 按下图设置通讯端口 选择Router ralay parameter 按下图设置网关 1.2型号Q Series 按下图设置IP、网关 按下图设置端口…

VDI 与 VM的區別

VDI 或虚拟桌面基础架构是一种计算机虚拟化形式&#xff0c;允许将桌面托管在远程服务器上。 它允许许多用户从一台中央服务器访问自己的虚拟桌面。 每个虚拟桌面都在单独的操作系统上运行&#xff0c;并拥有自己的资源&#xff0c;例如 CPU、内存和存储。 虚拟机 (VM) 是虚拟…