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.mzph.cn/bicheng/48664.shtml

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

相关文章

mysql oracle postgreSQL区别

MySQL、Oracle Database和PostgreSQL是三种流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它们各有特点&#xff0c;适用于不同的应用场景。以下是它们之间的一些主要区别&#xff1a; 1.许可证和成本&#xff1a; 1.MySQL是一个开源数据库&#xff0c;…

一个集Swagger2 和 OpenAPI3为一体的增强接口文档工具,一把为您的API文档需求量身定制的“利刃”(附源码)

前言 在微服务和分布式系统架构日益普及的今天&#xff0c;API文档的管理与维护成为了开发过程中的一个关键环节。开发者们常常面临着API文档更新不及时、格式不统一、难以维护和阅读的问题。此外&#xff0c;随着API数量的增加&#xff0c;管理和维护这些文档变得越来越复杂。…

unity2022 il2cpp 源码编译

新建一个XCODE静态库工程 从unity安装目录中找到il2cpp源码 Editor\Data\il2cpp\ 改名 il2cpp/libil2cpp -> il2cpp/il2cpp 加入工程中 ->工程根目录 extends/zlib libil2cpp/ buildSettings 相关设置 IOS Deployment Target ios 12.0 Header Search Paths $(in…

Anthropic的Claude安卓版能否赢得用户青睐?

Anthropic的Claude安卓版能否赢得用户青睐&#xff1f; 前言 Anthropic 就在7月18日&#xff0c;这家以"可控AI"著称的初创公司再次出手&#xff0c;推出了Claude的Android版本应用。这款APP不仅支持实时语言翻译&#xff0c;更传承了Anthropic一贯的隐私保护政策。C…

C++游戏时间——Maker_Game游戏头文件组1.0

我们都知道,C++可以写控制台、图形界面、静态库程序。 这几天,我写游戏都写炸毛了,但对于对静态库一窍不通的我,只能写图形库和控制台。 于是。。。。 Maker_Game游戏头文件组1.0诞生了! #include <Maker_Game/Ege.h> #include <Maker_Game/Console.h> Co…

基于SpringBoot+Vue的校园志愿者管理系统(带1w+文档)

基于SpringBootVue的校园志愿者管理系统(带1w文档) 基于SpringBootVue的校园志愿者管理系统(带1w文档) 本次设计任务是要设计一个校园志愿者管理系统&#xff0c;通过这个系统能够满足管理员和志愿者的校园志愿者信息管理功能。系统的主要功能包括首页、个人中心、志愿者管理、…

pytorch学习(十六)conda和pytorch的安装

1.安装anaconda 1.1 首先下载安装包 1&#xff09;进入anaconda官网 Anaconda | The Operating System for AI 2&#xff09;注册一下 3&#xff09;下载 4&#xff09;一直点直到安装完 5&#xff09;配置环境变量 在path路径中加入 Anaconda安装路径 Anaconda安装路径\S…

LeetCode 123题: 买卖股票的最佳时机 III代码优化(原创)

之前完成了LeetCode 123题&#xff1a; 买卖股票的最佳时机 III&#xff08;原创&#xff09;-CSDN博客&#xff0c;虽然完成代码编写&#xff0c;并提交成功&#xff0c;但运行效率不是很高。执行时长高达62ms&#xff0c;见下图&#xff1a; 看了下代码感觉可以通过将三维数组…

提交(git-add git-commit git-push)

当修改好一个功能的时候&#xff0c;可以提交到远程仓库&#xff0c;这样就等于更新了一次版本&#xff0c;那么下次改修了文件的话&#xff0c;是跟这个版本做对比的 git status&#xff0c; 查看文件修改情况&#xff0c;git add 假如你只想提交1个文件&#xff0c;那么直接…

IOC、DI<5> Unity、AOP、延迟获取对象、检索容器中注册信息

Unity.InterceptionExtension.ICallHandler实现一个操作日志记录功能 其它跟上一次一样 <?xml version"1.0" encoding"utf-8" ?> <configuration><configSections><section name"unity" type"Microsoft.Practice…

新手入门python该如何开始学习?学习路线是什么呢?

今天这篇文章从三个点给大家介绍一下新手学习Python的正确路线是什么、python最核心的知识点是什么 Python学习路线 Python学习路线可以大致分为以下几个阶段&#xff0c;每个阶段都包含了一系列核心知识点和技能&#xff1a; 第一阶段&#xff1a;Python基础 Python语言基础…

扫描某个网段下存活的IP:fping

前言&#xff1a; 之前用arp统计过某网段下的ip&#xff0c;但是有可能统计不全。网络管理平台又不允许登录。想要知道当前的ip占用情况&#xff0c;可以使用fping fping命令类似于ping&#xff0c;但比ping更强大。与ping需要等待某一主机连接超时或发回反馈信息不同&#x…

递归与迭代

1. 概念区别 递归&#xff08;recursion&#xff09;&#xff1a;递归常被用来描述以自相似方法重复事物的过程&#xff0c;在数学和计算机科学中&#xff0c;指的是在函数定义中使用函数自身的方法。&#xff08;A调用A&#xff09; 迭代&#xff08;iteration&#xff09;&…

nodejs学习之Rollup

官网 https://github.com/rollup/rollup 英文文档 中文文档 是什么 Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xf…

数据挖掘与分析部分实验内容

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

基于声学基元的高质量空间音频生成框架

关键词&#xff1a;人体姿态、声学基元、空间音频建模、体积渲染 过去几年中&#xff0c;渲染和动画制作逼真的3D人体模型技术已经发展成熟&#xff0c;并且达到了令人印象深刻的质量水平。然而&#xff0c;与这些全身模型相关联的空间音频建模&#xff0c;却在很大程度上被忽视…

【C++报错已解决】“Null Pointer Dereference“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在软件开发过程中&#xff0c;遇到 “Null Pointer Dereference” 报错可能会让你感到困惑。这个错误提示通常意味着你的程…

Git分支合并以及分支部分合并 提交记录合并

Git分支合并,以及分支部分合并,提交记录合并 最近工作中用到git分支合并的场景,记录一下. 分支整体合并,合并所有记录 仅合并分支部分代码

《从C/C++到Java入门指南》- 16.多维数组

多维数组 二维数组 打印一下 Java 中的二维数组会发现&#xff0c;打印的是 JVM 中的地址&#xff1a; import java.util.*; public class Main {public static void main(String[] args) {int arr[][] {{1, 2, 3},{4, 5, 6}};int ns[] {3, 4, 1, 3};System.out.println(A…

鸿蒙仓颉语言【互操作InterOp】

interoperate 语言的互操作&#xff0c;是必不可少的核心能力&#xff0c;在不同的操作系统平台上要与不同基础的OS接口api进行交互&#xff0c;以创建更合适的兼容层。 仓颉使用foreign关键字来声明调用的不同操作系统的基础API&#xff0c;声明的同时&#xff0c;明确数据类…