泛型委托Action与Func 【 优品课堂 C#进阶与提高系列 】
- 格式:docx
- 大小:222.35 KB
- 文档页数:8
C#Action委托 最近碰到了很多关于Action的⼀些代码,稍微看了下⽤法 Action的作⽤是封装⼀个函数,且该⽅法没有返回值(有返回值的函数⽆法被Action封装)。
同时Action还⽀持不同参数数量的函数,通过泛型来实现。
Action<T>代表Action所封装的函数是有⼀个参数,参数类型为T。
同理,Action最多⽀持16个参数的函数委托,不过每个参数的数据类型都要写到泛型⾥。
不同参数类型的Action声明: Action Action<T> Action<T,T> Action<T,T,T> ...... Action其实是⼀个委托delegate,如果我们使⽤delegate去封装⼀个函数的话,⾸先是需要进⾏委托声明的,如下⾯的代码1namespace Delegate_Action2 {3//⾃定义委托声明4public delegate void delegateFuntion();5class Program6 {7static void Main(string[] args)8 {9 Test t = new Test();10 delegateFuntion myFunction = t.Function; //函数封装11 myFunction();1213return;14 }15 }1617class Test18 {19public void Function()20 {21 Console.WriteLine("Test Function!");22 }23 }24 } 可以看到第4⾏进⾏了委托声明的动作,⽽为了操作简便,Action委托就可以免去这⼀步骤 如果⽤Action进⾏封装的话,代码如下1namespace Delegate_Action2 {3class Program4 {5static void Main(string[] args)6 {7 Test t = new Test();8 Action myAction = t.Function; //直接到位9 myAction();1011return;12 }13 }1415class Test16 {17public void Function()18 {19 Console.WriteLine("Test Function!");20 }21 }22 } 同时Action⽀持委托和匿名函数1namespace Delegate_Action2 {3class Program4 {5static void Main(string[] args)6 {7 Test t = new Test();8 Action myAction = delegate() { Console.WriteLine("Delegate Function!"); }; //直接到位9 myAction();1011return;12 }13 } 最后就是Action可以通过参数的形式传递函数,这样就可以将Action⽤作回调函数(个⼈感觉⽤处最多的地⽅),代码如下 1namespace Delegate_Action2 {3class Program4 {5static void Main(string[] args)6 {7 Test t = new Test(CallBackFuntion);8 t.Function();910return;11 }1213static void CallBackFuntion()14 {15 Console.WriteLine("Program Call Back Function!");16 }17 }1819class Test20 {21 Action callBack;2223public Test(Action cb)24 {25 callBack = cb;26 }2728public void Function()29 {30 Console.WriteLine("Test Function!");31 callBack(); 32 }33 }3435//结果:36// Test Function!37// Program Call Back Function!38 }。
泛型的使用方法
泛型的使用方法主要有三种:泛型类、泛型接口和泛型方法。
1. 泛型类:在类名的后面用尖括号括起一个(或多个)类型参数。
类型参数的作用域是定义这个类型参数的整个类,但不包括静态成员方法。
因为其类型参数不定,无法直接分配储存空间。
2. 泛型方法:在方法的返回类型前面加上一个类型参数T,并有<>括起来。
3. 泛型接口:在接口名之后加上类型参数。
通过使用泛型,可以更灵活地处理数据,避免代码的重复,提高代码的复用性。
C#中的Action、Func和Predicate如何使⽤前⾔委托是⼀个类型安全的函数指针,它可以引⽤与委托具有相同签名的⽅法。
委托常⽤于实现回调⽅法或者事件机制,在C#中⼀般⽤"delegate" 关键字声明。
你可以声明⼀个和类平级的委托,也可以嵌套在类中。
Func 和 Action 是什么,如何使⽤?两者最基本的区别是,前者适合那些需要带返回值的委托,后者适合那些不带返回值的委托。
Func 所引⽤的⽅法接收⼀个或者多个⼊参并带有⼀个返回值,Action所引⽤的⽅法接收⼀个或者多个参数并且没有返回值,换句话说,你的委托所引⽤的⽅法没有返回值,这时候适合⽤ Action。
Predicate所引⽤的⽅法接收⼀个或者多个泛型参数并且返回⼀个 bool 值,你可以假定它等价于 Func<T,bool>,Predicate 常⽤于对collection 进⾏⼀组条件检索。
C# 中使⽤ Action你可以使⽤委托去实现事件和回调⽅法,C#委托⾮常类似于C++中的函数指针,但是 C# 中的委托是类型安全的,你可以将⽅法作为参数传递给委托从⽽让委托指向该⽅法。
下⾯的代码⽚段展⽰了 Action 委托的语法结构。
Action<TParameter>接下来的代码清单展⽰了如何使⽤ Action 委托,当下⾯的代码执⾏结束后会在控制台打印 Hello 。
static void Main(string[] args){Action<string> action = new Action<string>(Display);action("Hello");Console.Read();}static void Display(string message){Console.WriteLine(message);}C# 中使⽤ Func现在我们⼀起学习下 Func 委托,下⾯是 Func 的语法结构。
c#中的数据类型简介(委托)c#中的数据类型简介(委托)什么是委托?委托是⼀种类型,它封装了⼀类⽅法,这些⽅法具有相同的⽅法签名(signature)和返回类型。
定义听起来有点拗⼝,⾸先可以确定委托是⼀种数据类型,那么什么是⽅法签名,其实就是指⽅法的输⼊参数列表。
来看下⾯的例⼦,类deleMthod定义了3个⽅法,add、minus 和multi,他们都具有相同的输⼊参数列表(int x,int y)和输出参数类型int,那么我们就说这三个⽅法具有相同的⽅法签名和返回类型。
开发者可以抽象地⽤ int 某名称(int x,int y) 的⼀种类型对⽅法进⾏封装,在c#中这种抽象的数据类型叫委托,针对上述的⼏个⽅法我们可以定义委托 : public delegate int Handler(int x ,int y),public 是⼀个访问修饰符,delegate关键字表⽰这是⼀个委托,int Hander(int x,int y)表⽰这个委托的名称。
class deleMethod{public int add(int x, int y){return x + y;}public int minus(int x, int y){return x - y;}public int multi(int x, int y){return x * y;}}怎么使⽤委托使⽤委托⼤体有四个步骤:定义⼀个委托类型,上节已经提及。
定义委托⽅法,上节deleMethod类中add、minus、multi都是委托⽅法,定义的⽬的就是为了使⽤它,讲专业点就是为了⽅法的调⽤委托变量及赋值,和类型⼀样,在使⽤前需要对变量赋值。
委托变量的使⽤。
怎样定义委托变量,还是接着上⾯的例⼦。
我们已经定义了⼀个委托类型 public delegate int Handler(int x,int y),和c#语法规范⼀样定义⼀个变量并赋值语法是:“类型名变量名 = new 类型名(⽅法);”,如上例“Handler deleCall = new Handler(⽅法名);“,在.net2.0后对于委托的实例化可以简化为” Handler deleCall = ⽅法名;“。
委托和lambda表达式,Action和Func1、为什么要⽤委托我们为什么要有委托?任何东西存在即合理,不合理的也会被时间淘汰掉,委托既然存在肯定有存在的必要,我们来看⼀下什么时候可以⽤到委托。
接下来我们有个需求,就是调⽤⼀个⽅法,取出1-1000个数字中所有是10的倍数的数字public static List<int> GetNum() {List<int> lst = new List<int>();//这个算法是最简陋的,但是举这个例⼦是最合适的for (int i = 1; i < 1000; i++){if (i%10==0) {lst.Add(i);}}return lst;}这个很好写,但是如果有⼀天,我们的需求变了,想取出1-1000个数字中所有是8的倍数的数字,那我们应该怎么写?是不是只要将if⾥⾯的条件改为i%8==0就⾏了,但是有⼀点变动的话就修改⽅法,说明这个⽅法写的并不好,如果⽅法很复杂的话修改也很艰难。
可能有⼈会说在添加⼀个获取是8的倍数的⽅法,这样的话会增加数据冗余,也就是重复的内容。
如果我们可以传递⽅法的话,只要传过来⼀个(有⼀个参数为int类型返回值为Boolean类型的⽅法),这个问题将不是问题public static List<int> GetNum(有⼀个int类型的参数返回值为Boolean类型的⽅法) {List<int> lst = new List<int>();for (int i = 1; i < 1000; i++){if (有⼀个int类型的参数返回值为Boolean类型的⽅法) {lst.Add(i);}}return lst;}是不是我们将想要获取什么样的数字这个操作来交给了调⽤者,⽆论调⽤者想获取1-1000以内什么样的数字都可以完成。
但是这个⽅法的前提就是可以传递⽅法,这个时候我们就需要⽤到委托了。
泛型的用法泛型是一种程序设计的技术,它让我们能够在编写代码时更灵活地处理不同类型的数据,而无需重复编写相似的代码。
泛型的概念可以追溯到Java语言的引入,但现在已经被许多主流编程语言所支持,例如C#、C++和Python等。
泛型的主要用途是增加代码的复用性和可维护性。
我们知道,在传统的程序设计中,如果想要编写一个可以应对不同数据类型的函数或类,就需要为每个数据类型单独编写相应的代码。
这不仅增加了代码量,也增加了维护的困难度。
而有了泛型,我们只需要编写一份通用的代码,就可以适应不同的数据类型。
这样一来,我们不仅能够节省大量的工作量,还可以有效地减少代码的错误和bug。
泛型的用法非常灵活,可以应用于各种场景。
比如,我们可以使用泛型来定义容器类,例如ArrayList,在创建ArrayList时,可以指定存储的数据类型,使得该ArrayList只能存储相应类型的数据。
这样一来,我们就可以确保我们在使用该ArrayList时不会出现类型错误。
另外,我们也可以使用泛型来编写算法,例如排序算法。
通过泛型,我们可以编写一份通用的排序算法,可以适应不同类型的数据,并且保证排序的正确性。
除了基本类型,泛型也可以应用于自定义的数据类型。
我们可以通过泛型来定义自己的类、接口和方法,使它们能够处理不同类型的数据。
这样一来,我们可以更加灵活地设计和实现我们的程序。
例如,我们可以定义一个泛型类来表示一个队列,它可以放入任何类型的数据。
这样一来,我们就可以在不同场景下使用相同的代码来处理不同类型的数据,提高了代码的可复用性和可维护性。
在使用泛型的时候,我们需要注意一些细节。
首先,我们需要使用尖括号"< >"来指定我们的泛型参数。
比如在定义一个泛型类时,我们可以使用类似于"ArrayList<T>"的形式来指定T为一个泛型参数。
其次,我们需要在使用泛型时进行类型的检查和类型的转换。
C#内置泛型委托之Func委托⼀、什么是Func委托Func委托代表有返回类型的委托⼆、Func委托定义查看Func的定义:using pilerServices;namespace System{//// 摘要:// 封装⼀个⽅法,该⽅法具有两个参数,并返回由 TResult 参数指定的类型的值。
//// 参数:// arg1:// 此委托封装的⽅法的第⼀个参数。
//// arg2:// 此委托封装的⽅法的第⼆个参数。
//// 类型参数:// T1:// 此委托封装的⽅法的第⼀个参数的类型。
//// T2:// 此委托封装的⽅法的第⼆个参数的类型。
//// TResult:// 此委托封装的⽅法的返回值类型。
//// 返回结果:// 此委托封装的⽅法的返回值。
[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")] public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);}你会发现,Func其实就是有多个输出参数并且有返回值的delegate。
3、⽰例Func⾄少0个输⼊参数,⾄多16个输⼊参数,根据返回值泛型返回。
必须有返回值,不可void。
Func<int> 表⽰没有输⼊参参,返回值为int类型的委托。
Func<object,string,int> 表⽰传⼊参数为object, string ,返回值为int类型的委托。
Func<object,string,int> 表⽰传⼊参数为object, string,返回值为int类型的委托。
Func<T1,T2,,T3,int> 表⽰传⼊参数为T1,T2,,T3(泛型),返回值为int类型的委托。
func函数的功能c语言func函数的一般格式为:返回值类型函数名(参数列表){函数体}其中,返回值类型为该函数返回的数据类型,函数名为该函数的名称,参数列表为该函数需要传入的参数,函数体为该函数的具体操作。
例如,下面是一个计算两个数之和的func函数:int add(int a, int b){int sum = a + b;return sum;}该函数的返回值为int型,函数名为add,参数列表为两个int型变量a和b,函数体为计算a和b的和并将结果赋给变量sum,然后将sum返回。
func函数的三个基本要素1. 返回值类型函数的返回值类型表示函数运算结束后所要返回的数据类型。
返回值类型可以是各种基本类型,比如int、float、char等,也可以是结构体、数组等类型。
返回值类型可以使用基本数据类型组成的表达式计算。
如果函数不需要返回值,则应该使用void类型作为返回值。
2. 参数列表参数列表指函数在被调用时所需要传递的参数。
参数可以是各种数据类型的变量,也可以是指针、结构体等类型。
参数列表可以为空,此时括号内留空即可。
函数参数的传递可以采用以下两种方式:按值传递:将参数的值复制到函数栈上,函数体内操作的是该值的副本。
3. 函数体函数体是函数的具体操作部分,包括各种逻辑结构、变量定义、运算操作等等,具体内容根据不同函数的用途而不同。
函数体中可以调用其他函数,也可以定义局部变量、全局变量,可以使用各种循环、条件、选择等结构实现不同的功能。
func函数是c语言中最基本、最通用也是最常用的一种函数。
主要原因在于它具有以下几个特点:1. 灵活性func函数可以根据不同的需求进行自由定义,返回值类型、参数列表、函数体都可以自由组合。
这使得它能够满足各种不同的操作需求。
2. 可复用性func函数可以在多个程序中重复使用,减少了程序的冗余,提高了代码的可维护性和可读性。
3. 易于调试func函数独立于程序主体,便于单独进行调试和优化,同时也方便了不同部分的协同开发。
C#委托(delegate)、泛型委托和Lambda表达式⽬录# 什么是委托1、从数据结构来讲,委托是和类⼀样是⼀种⽤户⾃定义类型。
2、委托是⽅法的抽象,它存储的就是⼀系列具有相同参数和返回类型的⽅法的地址。
调⽤委托的时候,委托包含的所有⽅法将被执⾏。
# 委托声明、实例化和调⽤1、声明委托是⼀种特殊的类,因此委托的声明与类的声明⽅法类似,在任何可以声明类的地⽅都可以声明委托。
委托声明⽤delegate关键字,同时委托要指明⽅法参数和返回值,写法与⽅法类似。
综合类的声明和⽅法的声明,委托声明写成如下形式:[访问修饰符] delegate 返回值类型委托名(形参列表);public delegate void MyDel();//定义了⼀个委托MyDel,它可以注册返回void类型且没有参数的函数public delegate void MyDel1(string str);//定义了⼀个委托MyDel1,它可以注册返回void类型且有⼀个string作为参数的函数public delegate int MyDel2(int a,int b);//定义了⼀个委托MyDel2,它可以注册返回int类型且有两个int作为参数的函数2、委托的实例化与普通类的使⽤⽅法相同,声明了委托之后,我们必须给委托传递⼀个具体的⽅法,才能在运⾏时调⽤委托实例。
委托实例包含了被传递给它的⽅法的信息,在运⾏时,调⽤委托实例就相当于执⾏它当中的⽅法。
委托实例化格式如下:委托类名委托实例名 = new 委托类名(Target) ;其中,委托实例名是⾃定义的名称,Target是要传⼊的⽅法的名称。
注意,Target是⽅法的引⽤,不能带()。
带()的话是该⽅法的调⽤。
区分引⽤和调⽤。
委托的实例化还有⼀种简单的⽅法:委托类名委托实例名 = Target;在需要委托实例的地⽅直接传⼊Target引⽤即可,C#编译器会⾃动根据委托类型进⾏验证,这称为“委托推断”。
func 参数-概述说明以及解释1.引言1.1 概述在编程中,函数(func)是一种用于执行特定任务的可重用代码块。
函数可以接收参数,这些参数是函数在执行任务时所需要的输入。
在函数定义中,我们可以在参数列表中定义参数,然后在函数体中使用这些参数进行操作和计算。
参数是函数中非常重要的一部分,它可以让函数更加通用和灵活。
通过参数,我们可以提供不同的输入值来调用函数,进而实现不同的功能。
函数参数不仅可以是简单的数据类型(如整数、浮点数、字符串等),还可以是更复杂的数据结构,甚至是其他函数。
Func参数有着广泛的应用场景,它可以用于传递数据、配置函数行为、实现回调等。
通过使用参数,我们可以使函数在不同的场景下表现出不同的行为,从而提高代码的可重用性和可扩展性。
本文将详细介绍func参数的定义、作用、使用方法以及注意事项。
我们将探讨不同类型的参数,如必需参数、默认参数、可变参数等。
同时,我们还将讨论在使用func参数时需要注意的一些常见问题,并提供一些最佳实践和技巧。
通过深入理解和灵活运用func参数,我们可以更好地组织和管理我们的代码。
同时,它也有助于我们编写更加通用、可扩展和可维护的程序。
让我们一起开始探索func参数的奥秘吧!1.2 文章结构本文分为引言、正文和结论三个部分。
引言部分概述了本文的主题,即"func 参数"。
在概述中,我们说明了func参数在编程中的重要性和广泛应用的情况,并介绍了本文的目的和结构。
正文部分详细探讨了func参数的定义、作用、使用方法和注意事项。
其中,我们将会解释func参数的基本概念和定义,说明它在程序中的作用和作用场景,并提供实际的使用示例。
同时,我们还会列举一些在使用func参数时需要注意的地方,帮助读者避免一些常见的错误和陷阱。
结论部分对整篇文章进行了总结并展望了func参数的未来发展。
我们将总结func参数的重要性和实际应用的意义,并展望它在未来的发展前景。
C#中泛型类泛型⽅法1,泛型好处:增加类型好处,带来编码的⽅便常见的泛型:泛型类和泛型⽅法,泛型委托(⾃定义委托,常见的泛型委托(Func,Action))泛型类的规范:public class 类名<T>{类的成员}T:仅仅是⼀个占位符,只要符合c#命名规范即可,但⼀般使⽤TT:表⽰⼀个普通的数据类型,在使⽤的时候⽤实际类型代替T:泛型类可以在定义中包含多个任意类型参数,参数之间⽤多个逗号分隔,例⼦:public MyGenericClass<T1,T2,T3>{...}⽤泛型类做⼀个简单的进栈,出栈public class MyStack<T>{private T[] stack;private int stacPoint;private int size;public MyStack(int size){this.size = size;this.stack = new T[size];this.stacPoint = -1;}public void Push(T item){if (stacPoint >= size){Console.WriteLine("栈空间已满");}else{stacPoint++;this.stack[stacPoint] = item;}}public T Pop(){T data = this.stack[stacPoint];stacPoint--;return data;}}static void Main(string[] args){MyStack<int> stack1 = new MyStack<int>(3);//⼊栈stack1.Push(1);stack1.Push(2);stack1.Push(3);//出栈Console.WriteLine(stack1.Pop());Console.WriteLine(stack1.Pop());Console.WriteLine(stack1.Pop());Console.ReadKey();}其他类型也是⼀样2,约束类型的泛型类//使⽤关键字whereclass MyGenericClass2<T1, T2, T3>where T1:struct //类型必须是值类型where T2: class//类型必须是引⽤类型where T3:new()//类型必须有⼀个⽆参数构造⽅法,且必须放到最后//除此之外还有多种其他类型//基类类型,接⼝类型等。
本节学习了泛型委托Action<T>和Fun<TResult>两类特殊的委托,这两个特殊的委托是Dot FrameWrok自带的。
结合lambda表达式,可以在写程序时,简洁代码和提高编码效率。
(一)Action<T>和Fun<TResult>两个委托的不同点:Action<T>只能委托必须是无返回值的方法Fun<TResult>只是委托必须有返回值的方法(二)代码演练using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;//方法一:显式声明了一个委托,并将对实例方法的引用分配给其委托实例。
publicdelegatevoid ShowName();publicdelegatevoid ShowNameWithParameter(string name);publicdelegatevoid ShowAge(int age);publicdelegatevoid ShowNameAndAge(string name, int age);publicdelegateint ReturnName(string name);namespace ActionDemo{publicclass Person{privatestring instanceName;publicstring InstanceName{get { return instanceName; }set { instanceName = value; }}privateint instanceAge;publicint InstanceAge{get { return instanceAge; }set { instanceAge = value; }}public Person(string name,int age){this.instanceName = name;this.instanceAge = age;}publicvoid DisplayName(){Console.WriteLine("Name:{0}",this.instanceName);}publicvoid DisplayName(string name){Console.WriteLine("Name:{0}",name);}publicvoid DisplayAge(int age){Console.WriteLine("Age:{0}",age);}publicvoid DisplayNameAndAge(string name, int age){Console.WriteLine(string.Format("Name:{0} And Age:{1} ",name,age)); }publicint GetAgeByName(string name){if(name==instanceName){return instanceAge;}else{return-1;}}}class Program{privatestaticvoid Print(string s){Console.WriteLine(s);}staticvoid Main(string[] args){#region Action<T>相关Person person =new Person("joetao",21);//非泛型委托//ShowName showName = new ShowName(name.DisplayName);//另一种写法ShowName showName = person.DisplayName;showName();ShowNameWithParameter showNameWithParameter = person.DisplayName; showNameWithParameter(person.InstanceName);ShowAge showAge = person.DisplayAge;showAge(person.InstanceAge);ShowNameAndAge showNameAndAge = person.DisplayNameAndAge; showNameAndAge(person.InstanceName, person.InstanceAge);//泛型委托Action<T,...>这里指多个类型参数//Action<T,..>委托:只能委托无返回值(void)的方法。
C#的委托 初次接触委托事件时,⼀头雾⽔,但是随着接触的多了,⽤的多了也慢慢的就懂了,现在想来其实就类似于你要做某件事情时,委托给别⼈做,⽐如⼩明让室友⼩张帮忙带饭,在这个例⼦⾥,就是⼩明通知(委托)室友⼩张带饭。
先不多说,先上⼀段委托的⼀种例⼦1//⼩张类2public class MrZhang3 {4//其实买车票的悲情⼈物是⼩张5public static void BuyFood()6 {7 Console.WriteLine("去买饭!");8 }9 }1011//⼩明类12class MrMing13 {14//声明⼀个委托,其实就是个“命令”15public delegate void BuyFoodEventHandler();1617public static void Main(string[] args)18 {19//这⾥就是具体阐述这个命令是⼲什么的,本例是MrZhang.BuyFood“⼩张买饭”20 BuyFoodEventHandler myDelegate = new BuyFoodEventHandler(MrZhang.BuyFood);2122//这时候委托被附上了具体的⽅法23 myDelegate();24 Console.ReadKey();25 }26 }声明⼀个委托,然后会有对应的⼀个⽅法,在委托实例化时传进来,调⽤的时候像调⽤⼀个⽅法时调⽤的,在具体使⽤哪个⽅法时,直接像传递参数⼀样将⽅法传进去。
我们来看下委托的定义: 访问修饰符 delegate 返回值类型委托名称(参数1, 参数1, 参数n…); 例如:public delegate void BuyFoodEventHandler ();//没有参数,也没有返回类型的 public delegate int AA (int num);//返回值为int类型的,有⼀个参数的委托1、在实例化委托对象时,委托的⽅法必须要有,因为委托的构造函数是不为空的,如:BuyFoodEventHandler myDelegate = new BuyFoodEventHandler(MrZhang.BuyFood);其中BuyFoodEventHandler (委托⽅法)2、委托的参数和返回类型,都要和具体的委托⽅法的⼀致 我们在来说说泛型委托system.Action和system.Func: system.Action:是没有返回参数的 system.Func:是带有返回参数的刚刚上⾯的例⼦我们可以⽤泛型委托1//⼩张类2public class MrZhang {3public static void BuyFood() {4 Console.WriteLine("去买饭!");5 }6 }789//⼩明类10class MrMing11 {12//声明⼀个委托,其实就是个“命令”13public System.Action buyFoodEventHandler(); //没有返回类型,也没有参数1415public static void Main(string[] args)16 {17//这⾥就是具体阐述这个命令是⼲什么的,本例是MrZhang.BuyFood“⼩张买饭”18 buyFoodEventHandler += MrZhang.BuyFood;1920//这时候委托被附上了具体的⽅法21 buyFoodEventHandler();22 Console.ReadKey();23 }24 }。
c#委托、泛型委托和匿名⽅法题外话:别指望看第⼀遍书就能记住和掌握什么——请看第⼆遍、第三遍。
本⼈⼥猿⼀枚,2年⼯作经验,喜欢钻研,喜欢创新,闲暇之余喜欢写写博客,深知⾃⾝能⼒薄弱,如表达错误、不当之处请园友们多多指出,互相交流。
最近在学习lambda表达式,lambda表达式与匿名⽅法有着密切联系,⽽匿名⽅法⼜离不开委托,索性我就围绕委托、泛型、匿名⽅法做个总结,以加深我的理解,总结的内容很基础,希望各位⼤神看后勿喷。
⾸先,引⽤MSDN上的原话解释这⼏个名词:委托:是⼀种引⽤⽅法的类型。
⼀旦为委托分配了⽅法,委托将与该⽅法具有完全相同的⾏为。
泛型:泛型是 2.0 版 C# 语⾔和公共语⾔运⾏库 (CLR) 中的⼀个新功能,使⽤泛型类型可以最⼤限度地重⽤代码、保护类型的安全以及提⾼性能。
匿名⽅法:在 2.0 之前的 C# 版本中,声明的唯⼀⽅法是使⽤。
C# 2.0 引⼊了匿名⽅法。
要将代码块传递为委托参数,创建匿名⽅法则是唯⼀的⽅法。
如果使⽤匿名⽅法,则不必创建单独的⽅法,因此减少了实例化委托所需的编码系统开销。
MSDN解释的挺透彻的了,我就不多嘴了,下⾯看看具体的实例。
委托有了委托,我们就可以把⽅法当成参数来传递,⽤委托对象调⽤它所指向的⽅法,委托与c++中的指针很相似,但是委托是类型安全的。
⾸先先看⼀个例⼦:⼩张委托⼩明去打热⽔://定义⼀个委托public delegate void GetHotWaterEventHandler();static void Main(string[] args){//声明⼀个委托对象,并绑定⼀个⽅法GetHotWaterEventHandler Getwater = new GetHotWaterEventHandler(MyHotWater);Getwater();//使⽤委托调⽤⽅法Console.ReadKey();}//⼩明打热⽔⽅法private static void MyHotWater(){Console.WriteLine("Oh,NO!命苦的我⼜要去打热⽔了!");}上⾯就是⼀个简单的委托,该委托没有返回值,没有传⼊参数,实际使⽤时,委托的返回值和形参要与绑定的⽅法相同,否则会报错。
C#委托⽤法详解⽬录1、什么是委托2、委托的定义3、委托的实例化3.1使⽤new关键字3.2使⽤匿名⽅法3.3使⽤Lambda表达式4、泛型委托5、C#内置泛型委托6、多播委托1、什么是委托从数据结构来讲,委托是和类⼀样是⼀种⽤户⾃定义类型。
委托是⽅法的抽象,它存储的就是⼀系列具有相同签名和返回回类型的⽅法的地址。
调⽤委托的时候,委托包含的所有⽅法将被执⾏。
2、委托的定义委托是类型,就好像类是类型⼀样。
与类⼀样,委托类型必须在被⽤来创建变量以及类型对象之前声明。
委托的声明原型是delegate <函数返回类型> <委托名> (<函数参数>)例⼦:public delegate void MyDelegate(int number);//定义了⼀个委托MyDelegate,它可以注册返回void类型且有⼀个int作为参数的函数3、委托的实例化3.1 使⽤new关键字委托实例化的原型是<委托类型> <实例化名>=new <委托类型>(<注册函数>)例⼦:MyDelegate _MyDelegate=new MyDelegate(CheckMod);//⽤函数CheckMod实例化上⾯的MyDelegate 委托为_MyDelegate3.2 使⽤匿名⽅法<委托类型> <实例化名>=delegate(<函数参数>){函数体};3.3 使⽤Lambda表达式class Program{//声明委托delegate int MyDelegate(int x, int y);static void Main(string[] args){//实例化委托//1、使⽤new关键字MyDelegate _myDelegate = new MyDelegate(GetSum);//2、使⽤匿名⽅法MyDelegate myDelegate = delegate(int x, int y){return x + y;};//3、使⽤Lambda表达式MyDelegate myDelegateLambda = (int x, int y) => { return x + y; };}static int GetSum(int x, int y){return x + y;}}4、泛型委托委托也⽀持泛型的使⽤泛型委托原型:delegate <T1> <委托名><T1,T2,T3...> (T1 t1,T2 t2,T3 t3...)例如:delegate T2 DelegateDemo<T1,T2>(T1 t);//定义有两个泛型(T1,T2)的委托,T2作为委托函数返回类型,T1作为委托函数参数类型static boo Check(int i){if(i%2==0){return true;}return false;}static void Main(string[] args){DelegateDemo<int, bool> _delegate =Check;//将泛型委托委托<T1,T2>实例化为<int,bool>,即表⽰有⼀个int类型参数且返回类型是bool的函数.Console.WriteLine(_delegate(9));//false}5、C#内置泛型委托C#共有3种内置泛型委托namespace DelegateDemo{class Program{//声明委托delegate int MyDelegate(int x, int y);static void Main(string[] args){//1、Action<T>只能委托必须是⽆返回值的⽅法Action<string> _action = new Action<string>(SayHello);_action("Hello World");//2、Fun<TResult>只是委托必须有返回值的⽅法Func<int, bool> _func = new Func<int, bool>(Check);_func(5);//3、Predicate:此委托返回⼀个bool值,该委托通常引⽤⼀个"判断条件函数"。
Delegate,Action,Func,Predicate的使用与区别C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷。
与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对其进行详细的说明。
在书写代码时,常常会用到委托,这个在winform下较常见,但自定义Delegate时,我们常常发现Delegate必须全局可见,才能在需要的地方进行使用,而对于私有的delegate对象,在本类中进行使用,这似乎是不方便的。
下边我们来看传统的Delegate的写法。
publicdelegatevoid MyDelegate(string name);publicclass MyBlogBase{private MyDelegatemydelegate;}必须保证MyDelegate放在类的外边,才能在其他地方可见,并使用,Action,Func的出现改变了这一局面,这两个其实说白了就是系统定义好的Delegate,他有很多重载的方法,便于各种应用情况下的调用。
他在系统的System命名空间下,因此全局可见。
下文就说明Action,Action有多个重载,下文已Action<T>为例进行说明Action<T>:封装一个方法,该方法只有一个参数并且不返回值。
其中T是可接收的任何类型。
使用代码如下:publicclass MyBlogBase{public string myName;Action<string> myAction;public MyBlogBase(){//myAction = delegate(string curName) { myName = curName; };//myAction = new Action<string>(SetAction);myAction = curname => { myName = curname; };}private void SetAction(string name){myName = name;}}在上例中,给出了3种使用Action的方法,方法一:采用匿名委托,方法二:指定一个实际的方法。
泛型参数active和func
泛型参数active和func可能指的是某个函数或方法中的两个
泛型参数。
- active:通常用于表示某个实例是否处于活动状态的参数。
可以是一个布尔值或枚举类型。
在泛型中,active可以用来表示
某个对象是否处于活动状态,根据它的值可以进行相应的操作或处理。
- func:通常用于表示某个函数或方法的参数类型。
它可以是
一个函数类型,用来指定待执行的函数或方法。
在泛型中,func可以作为一个泛型参数,用来接收不同类型的函数或方法,并在运行时根据具体的类型进行调用。
可以通过传递不同的函数或方法来实现不同的功能。
具体的含义和用法还需要结合具体的上下文来确定。
C#中委托的基础⼊门与实现⽅法⽬录前⾔关于委托委托的实现⼀、基本实现⽅式⼆、使⽤委托时的⼀些特殊⽅式1、委托实例对象的创建多元化:2、事件绑定的多种⽅式三、委托的⼏种特殊实现⽅式1,使⽤Action⽅法2,使⽤Func⽅法四、委托的⼀些特殊⼩知识1、委托闭包的产⽣2,关于事件总结前⾔似乎委托对于C#⽽⾔是⼀种⾼级属性,但是我依旧希望你就算第⼀次看我的⽂章,也能有很⼤的收获。
所以本博客的语⾔描述尽量简单易懂,知识点也是⾯向初⼊门对于委托不了解的学习者的。
当然如果有幸有⼤佬发现⽂章的错误点,也欢迎留⾔指出!关于委托关于委托的介绍主要来源于C#⽂档:(本⽂章优势在于去掉⼀些不必要的细节,对于初学者⽽⾔简单⾼效)委托的定义主要是下⾯⼏个⽅⾯:委托是⼀种引⽤类型:表⽰对具有特定参数列表和返回类型的⽅法的引⽤在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的⽅法相关联。
你可以通过委托实例调⽤⽅法委托本质上来讲就是将⽅法作为参数传递给其他⽅法的⼀种实现⽅式,当然开发者也可以直接去调⽤⽅法。
但是当⼀个项⽬扩展到⾜够⼤时,这种直接调⽤的⽅式就会很复杂,难以维护。
⽽委托不会,可以很⽅便的进⾏后期的扩展开发。
只需要将⾃⼰的⽅法传⼊已经写好的对应的委托即可。
⽽不需要再在⼤量的代码中找到调⽤处写⼊⾃⼰的⽅法。
关于委托的⼀些特点是(暂时不了解没有关系):委托类似于 C++ 函数指针,但委托完全⾯向对象,不像 C++ 指针会记住函数,委托会同时封装对象实例和⽅法。
委托允许将⽅法作为参数进⾏传递。
委托可⽤于定义回调⽅法。
委托可以链接在⼀起;例如,可以对⼀个事件调⽤多个⽅法。
⽅法不必与委托类型完全匹配。
有关详细信息,请参阅使⽤委托中的变体。
使⽤Lambda 表达式可以更简练地编写内联代码块。
Lambda表达式(在某些上下⽂中)可编译为委托类型。
若要详细了解lambda 表达式,请参阅lambda 表达式。
如果对于⼀个初学者,你可以简单的理解,委托就是⼀个更⾼级的调⽤⽅法的⽅式,⽽你要学习的,就是这种⽅式的实现⽅法,然后后期再慢慢理解更多的细节。
泛型方法的调用
泛型方法是一种可以根据传入参数的类型来确定其返回值类型
的方法,它能够提高代码的复用性和可读性。
在调用泛型方法时,需要在方法名后加上尖括号,括号中包含泛型类型的实际参数,例如:<T> T method(T arg)。
如果实际参数是一个类,则需要传入该类的类型参数,例如Integer、String等;如果实际参数是一个泛型类型,则需要传入该泛型类型的具体类型参数,例如List<String>、
Map<Integer, String>等。
在调用时,可以根据需要传入实际参数,编译器会根据传入的实际参数类型自动推导泛型类型的具体参数。
需要注意的是,在使用泛型方法时,必须要有实际参数类型的信息,否则编译器无法推导泛型类型的具体参数。
- 1 -。
江西省南昌市2015-2016学年度第一学期期末试卷(江西师大附中使用)高三理科数学分析一、整体解读试卷紧扣教材和考试说明,从考生熟悉的基础知识入手,多角度、多层次地考查了学生的数学理性思维能力及对数学本质的理解能力,立足基础,先易后难,难易适中,强调应用,不偏不怪,达到了“考基础、考能力、考素质”的目标。
试卷所涉及的知识内容都在考试大纲的范围内,几乎覆盖了高中所学知识的全部重要内容,体现了“重点知识重点考查”的原则。
1.回归教材,注重基础试卷遵循了考查基础知识为主体的原则,尤其是考试说明中的大部分知识点均有涉及,其中应用题与抗战胜利70周年为背景,把爱国主义教育渗透到试题当中,使学生感受到了数学的育才价值,所有这些题目的设计都回归教材和中学教学实际,操作性强。
2.适当设置题目难度与区分度选择题第12题和填空题第16题以及解答题的第21题,都是综合性问题,难度较大,学生不仅要有较强的分析问题和解决问题的能力,以及扎实深厚的数学基本功,而且还要掌握必须的数学思想与方法,否则在有限的时间内,很难完成。
3.布局合理,考查全面,着重数学方法和数学思想的考察在选择题,填空题,解答题和三选一问题中,试卷均对高中数学中的重点内容进行了反复考查。
包括函数,三角函数,数列、立体几何、概率统计、解析几何、导数等几大版块问题。
这些问题都是以知识为载体,立意于能力,让数学思想方法和数学思维方式贯穿于整个试题的解答过程之中。
二、亮点试题分析1.【试卷原题】11.已知,,A B C 是单位圆上互不相同的三点,且满足AB AC →→=,则AB AC →→⋅的最小值为( )A .14-B .12-C .34-D .1-【考查方向】本题主要考查了平面向量的线性运算及向量的数量积等知识,是向量与三角的典型综合题。
解法较多,属于较难题,得分率较低。
【易错点】1.不能正确用OA ,OB ,OC 表示其它向量。
2.找不出OB 与OA 的夹角和OB 与OC 的夹角的倍数关系。
【解题思路】1.把向量用OA ,OB ,OC 表示出来。
2.把求最值问题转化为三角函数的最值求解。
【解析】设单位圆的圆心为O ,由AB AC →→=得,22()()OB OA OC OA -=-,因为1OA OB OC ===,所以有,OB OA OC OA ⋅=⋅则()()AB AC OB OA OC OA ⋅=-⋅-2OB OC OB OA OA OC OA =⋅-⋅-⋅+ 21OB OC OB OA =⋅-⋅+设OB 与OA 的夹角为α,则OB 与OC 的夹角为2α所以,cos 22cos 1AB AC αα⋅=-+2112(cos )22α=--即,AB AC ⋅的最小值为12-,故选B 。
【举一反三】【相似较难试题】【2015高考天津,理14】在等腰梯形ABCD 中,已知//,2,1,60AB DC AB BC ABC ==∠= ,动点E 和F 分别在线段BC 和DC 上,且,1,,9BE BC DF DC λλ==则AE AF ⋅的最小值为 .【试题分析】本题主要考查向量的几何运算、向量的数量积与基本不等式.运用向量的几何运算求,AE AF ,体现了数形结合的基本思想,再运用向量数量积的定义计算AE AF ⋅,体现了数学定义的运用,再利用基本不等式求最小值,体现了数学知识的综合应用能力.是思维能力与计算能力的综合体现. 【答案】2918【解析】因为1,9DF DC λ=12DC AB =,119199918CF DF DC DC DC DC AB λλλλλ--=-=-==, AE AB BE AB BC λ=+=+,19191818AF AB BC CF AB BC AB AB BC λλλλ-+=++=++=+,()221919191181818AE AF AB BC AB BC AB BC AB BCλλλλλλλλλ+++⎛⎫⎛⎫⋅=+⋅+=+++⋅⋅ ⎪ ⎪⎝⎭⎝⎭19199421cos1201818λλλλ++=⨯++⨯⨯⨯︒2117172992181818λλ=++≥+= 当且仅当2192λλ=即23λ=时AE AF ⋅的最小值为2918. 2.【试卷原题】20. (本小题满分12分)已知抛物线C 的焦点()1,0F ,其准线与x 轴的交点为K ,过点K 的直线l 与C 交于,A B 两点,点A 关于x 轴的对称点为D . (Ⅰ)证明:点F 在直线BD 上; (Ⅱ)设89FA FB →→⋅=,求BDK ∆内切圆M 的方程. 【考查方向】本题主要考查抛物线的标准方程和性质,直线与抛物线的位置关系,圆的标准方程,韦达定理,点到直线距离公式等知识,考查了解析几何设而不求和化归与转化的数学思想方法,是直线与圆锥曲线的综合问题,属于较难题。
【易错点】1.设直线l 的方程为(1)y m x =+,致使解法不严密。
2.不能正确运用韦达定理,设而不求,使得运算繁琐,最后得不到正确答案。
【解题思路】1.设出点的坐标,列出方程。
2.利用韦达定理,设而不求,简化运算过程。
3.根据圆的性质,巧用点到直线的距离公式求解。
【解析】(Ⅰ)由题可知()1,0K -,抛物线的方程为24y x =则可设直线l 的方程为1x my =-,()()()112211,,,,,A x y B x y D x y -,故214x my y x =-⎧⎨=⎩整理得2440y my -+=,故121244y y m y y +=⎧⎨=⎩则直线BD 的方程为()212221y y y y x x x x +-=--即2222144y y y x y y ⎛⎫-=- ⎪-⎝⎭令0y =,得1214y yx ==,所以()1,0F 在直线BD 上.(Ⅱ)由(Ⅰ)可知121244y y m y y +=⎧⎨=⎩,所以()()212121142x x my my m +=-+-=-,()()1211111x x my my =--= 又()111,FA x y →=-,()221,FB x y →=-故()()()21212121211584FA FB x x y y x x x x m →→⋅=--+=-++=-,则28484,93m m -=∴=±,故直线l 的方程为3430x y ++=或3430x y -+=213y y -===±,故直线BD 的方程330x -=或330x -=,又KF 为BKD ∠的平分线,故可设圆心()(),011M t t -<<,(),0M t 到直线l 及BD 的距离分别为3131,54t t +--------------10分 由313154t t +-=得19t =或9t =(舍去).故圆M 的半径为31253t r +== 所以圆M 的方程为221499x y ⎛⎫-+= ⎪⎝⎭【举一反三】【相似较难试题】【2014高考全国,22】 已知抛物线C :y 2=2px(p>0)的焦点为F ,直线y =4与y 轴的交点为P ,与C 的交点为Q ,且|QF|=54|PQ|.(1)求C 的方程;(2)过F 的直线l 与C 相交于A ,B 两点,若AB 的垂直平分线l′与C 相交于M ,N 两点,且A ,M ,B ,N 四点在同一圆上,求l 的方程.【试题分析】本题主要考查求抛物线的标准方程,直线和圆锥曲线的位置关系的应用,韦达定理,弦长公式的应用,解法及所涉及的知识和上题基本相同. 【答案】(1)y 2=4x. (2)x -y -1=0或x +y -1=0. 【解析】(1)设Q(x 0,4),代入y 2=2px ,得x 0=8p,所以|PQ|=8p ,|QF|=p 2+x 0=p 2+8p.由题设得p 2+8p =54×8p ,解得p =-2(舍去)或p =2,所以C 的方程为y 2=4x.(2)依题意知l 与坐标轴不垂直,故可设l 的方程为x =my +1(m≠0). 代入y 2=4x ,得y 2-4my -4=0. 设A(x 1,y 1),B(x 2,y 2), 则y 1+y 2=4m ,y 1y 2=-4.故线段的AB 的中点为D(2m 2+1,2m), |AB|=m 2+1|y 1-y 2|=4(m 2+1).又直线l ′的斜率为-m ,所以l ′的方程为x =-1m y +2m 2+3.将上式代入y 2=4x ,并整理得y 2+4m y -4(2m 2+3)=0.设M(x 3,y 3),N(x 4,y 4),则y 3+y 4=-4m,y 3y 4=-4(2m 2+3).故线段MN 的中点为E ⎝ ⎛⎭⎪⎫2m2+2m 2+3,-2m ,|MN|=1+1m 2|y 3-y 4|=4(m 2+1)2m 2+1m 2.由于线段MN 垂直平分线段AB ,故A ,M ,B ,N 四点在同一圆上等价于|AE|=|BE|=12|MN|,从而14|AB|2+|DE|2=14|MN|2,即 4(m 2+1)2+⎝ ⎛⎭⎪⎫2m +2m 2+⎝ ⎛⎭⎪⎫2m 2+22=4(m 2+1)2(2m 2+1)m 4,化简得m 2-1=0,解得m =1或m =-1, 故所求直线l 的方程为x -y -1=0或x +y -1=0.三、考卷比较本试卷新课标全国卷Ⅰ相比较,基本相似,具体表现在以下方面: 1. 对学生的考查要求上完全一致。
即在考查基础知识的同时,注重考查能力的原则,确立以能力立意命题的指导思想,将知识、能力和素质融为一体,全面检测考生的数学素养,既考查了考生对中学数学的基础知识、基本技能的掌握程度,又考查了对数学思想方法和数学本质的理解水平,符合考试大纲所提倡的“高考应有较高的信度、效度、必要的区分度和适当的难度”的原则. 2. 试题结构形式大体相同,即选择题12个,每题5分,填空题4 个,每题5分,解答题8个(必做题5个),其中第22,23,24题是三选一题。
题型分值完全一样。
选择题、填空题考查了复数、三角函数、简易逻辑、概率、解析几何、向量、框图、二项式定理、线性规划等知识点,大部分属于常规题型,是学生在平时训练中常见的类型.解答题中仍涵盖了数列,三角函数,立体何,解析几何,导数等重点内容。
3. 在考查范围上略有不同,如本试卷第3题,是一个积分题,尽管简单,但全国卷已经不考查了。
四、本考试卷考点分析表(考点/知识点,难易程度、分值、解题方式、易错点、是否区分度题)。