展开

关键词

温故而知新:Delegate,Action,Func,匿名,匿名委托,事件

一、委托Delegate一般的(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如 public void HelloWorld() , name);}但是有些时候,我们希望把一个本身当做参数传递给另一个,比如myObject.callMethod(HelloWorld);在没有委托之前,这是一件极困难的事情,委托出现以后,这就是一件很容易的事情了 ,简单点讲:委托就是一种能把当做参数来使用的类型--当然这个定义跟官的解释比起来极不严密,但易于理解要点:1.委托是一种类型(跟string,int,double...一样是.net的一种基本类型 )2.委托的定义必须与最终被调用的保持签名一致比如:下面代码中的delegate void D1(); 与 static void HelloWorld1(),我们抛开前面的类型关键字delegate ; void HelloWorld3(string name);它们的签名格式都是 void X(string Y)3.委托的好处之一在于可以保持签名格式不变的情况下,动态调用不同的处理逻辑(即不同的

25760

C# 委托Func() 中 GetInvocationList() 的使用 | 接收委托多个返回值

在日常使用委托时,有以下常用 名称说明  Clone   创建委托的浅表副本。  GetInvocationList   按照调用顺序返回此多路广播委托的调用列表。   RemoveImpl   调用列表中移除与指定委托相等的元素 ----GetInvocationList() 的用途当委托有多个返回值时当你编写一个 delegate委托 或 Func泛型委托 ,并为实例绑定多个时 ,每个都有一个返回值。 可能会遇到这种情况: class Program { public static string a(string str) { Console.WriteLine(a); return str+ c(string str) { Console.WriteLine(c); return str + c; } static void Main(string args) { Func func

15020
  • 广告
    关闭

    云产品限时秒杀

    云服务器1核2G首年38元,还有多款热门云产品满足您的上云需求

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# action,delegate,func的用和区别

    以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种式,然后发现确实代码简洁了不少 开始分析1:小明要买一本一个程序员自我修养的书籍(xx书就不买)硬性要求 (这就是要定义委托性质)代码: private delegate void BuyBook();2:附近书店 (委托的)代码 的用小明又发生疑问了,每次我自己都去书店去拿书,有没有一种直接送到我家里呢,那么Func专门提供了这样的服务Func 解释 封装一个不定具有参数(也许没有)但却返回 TResult 参数指定的类型值的 1:我们先看一个没有参数只有返回值的 static void Main(string args){ Func RetBook = new Func(FuncBook); Console.WriteLine (我在测试一下传过来值:{0},RetFunc); } 总结1:Action用于没有返回值的(参数可以根据自己情况进行传递)2:Func恰恰相反用于有返回值的(同样参数根据自己情况情况)3:记住无返回就用

    10310

    c# 委托(Func、Action)

    1、Func (封装,传入参数, 有返回值)Func (T1, T2, ...)   封装一个,该有 (0 123  ... 16)个参数,且返回由 TResult 参数指定的值的类型。 public static void Main() { 一: Func 相当于系统内置的 委托 Func method = Calculate; 二: 调用 Lambda 实现, 更简洁 (封装一个, 传入参数, 无返回值) Action(t1, t2, t3 ...)封装一个, 该传入 (012 ...) 根据官文档,在以下情况下,请使用委托: 当使用事件设计模式时。 当封装静态可取时。 当调用不需要访问实现该的对象中的其他属性、或接口时。 需要便的组合。

    4.8K30

    C#泛型委托Predicate、Action、Func

    PredicatePredicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的。此委托由 Array 和 List 类的几种使用,用于在集合中搜索元素。通过查看源码发现? 查看源代码可以发现,Array数组的其他很多同样都使用了Predicate委托? Func?可以很清楚的看出,封装一个带有返回 TResult 参数指定的类型值的,它有多个重载。下面我们通过委托来处理一下3*5=15的过程。 声明一个乘,并且返回字符串,然后调用。? void FuncTest() { Func func=new Func(MultiMethod); string result = func(3, 5); }结果为?

    61220

    golang的func的一些笔记

    先看一看func 的基本构成元素func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return}其中: 关键字———func 这个是定义函数的关键字 函数拥有者—(p myType) 这个是此函数的拥有者,下面解释(此项可省略) 名———funcName 这个是定义函数的名字 入参———— a,b int,b string 这个是定义函数的入参 返回值——— r,s int 这个是定义函数的返回值,golang可以返回多个值 函数体——— { }重点说说这个函数拥有者(p myType),这个是相较于CC++比较特殊的地。 为特定类型定义函数,即为类型对象定义 在Go中通过给函数标明所属类型,来给该类型定义,上面的 (p myType) 即表示给myType声明了一个, p myType 不是必须的。 func (m *Mssql) Open() (err error) { var conf []string conf = append(conf, Provider=SQLOLEDB) conf =

    61530

    C#:Func的同步、异步调用

    实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步式调用,以加速系统响应或改善用户体验,下面是一个示例:有一个现成的类MyMath,里面有一个Add:  1 public class MyMath public int Add(int a, int b) 5 { 6 System.Threading.Thread.Sleep(5000); 7 return a + b; 8 } 9 10 }对Add做下封装 ”与异步调用二个版本: 1 异步调用 2 3 4 5 6 7 static void AyscAdd(int a, int b, Action callBackAction) 8 { 9 Func func = () =>10 {11 return new MyMath().Add(a, b);12 };13 func.BeginInvoke((ar) =>14 {15 var result = func = () =>35 {36 return new MyMath().Add(a, b);37 };38 func.BeginInvoke((ar) =>39 {40 var result =

    63460

    【iOS开发】@objc private class func 与 Selector

    ---1. private 关键字 最简单的使用 Selector 的情况,就是如上面所列出的,在 NSTimer 中写 selector 为 moveText,然后我们在同一个文件中,再相应地写一个func 然而如果你想把它声明为一个 private func,即不希望其他文件调用这个函数,就会出现问题,通俗地讲:private 使得这个函数不能被『外部』调用,而 Selector 对它的调用,实际上就是一种 【解决案】 KVO 是基于 KVC 和动态派发技术(Dynamic Dispatch)的,Swift 为了效率禁用了 Objective-C 中有的动态派发。 OC 中动态调用时相同的运行时特性(@objc 足矣,这个一般用不上)dynamic private func moveText(){ Your Code}更多关于 dynamic 关键字的内容可以参考 :http:swifter.tipskvo----2. class 关键字 如果你想把这个函数声明为 class funcclass func moveText(){ Your Code}则本文最开始的代码中的

    45610

    如何使用C#中的Action,Func和Predicate?

    nsdr=true委托是一个类型安全的函数指针,它可以引用与委托具有相同签名的。委托常用于实现回调或者事件机制,在C#中一般用 delegate 关键字声明。 Func 所引用的接收一个或者多个入参并带有一个返回值,Action所引用的接收一个或者多个参数并且没有返回值,换句话说,你的委托所引用的没有返回值,这时候适合用 Action。 Predicate所引用的接收一个或者多个泛型参数并且返回一个 bool 值,你可以假定它等价于 Func,Predicate 常用于对 collection 进行一组条件检索。 C# 中使用 Action你可以使用 委托 去实现事件和回调,C#委托非常类似于C++中的函数指针,但是 C# 中的 委托 是类型安全的,你可以将作为参数传递给委托从而让委托指向该。 (); } static double CalculateHra(int basic) { return (double)(basic * .4); }值得注意的是,Func 委托的第二个参数表示的返回值

    24920

    【opencv】cv::Mat 公有成员函数 (Public Member Func)

    用来度量每一个像素中每一个通道的精度,但它本身与图像的通道数无关。 depth数值越大,精度越高。 Mat.depth()得到的是一个0~6的数字,分别代表...

    41920

    dotnet 如何在 Mock 模拟 Func 判断调用次数

    Returns 是模拟返回值 mock.Setup(func => func(0)).Returns(林德熙是逗比);判断用户调用了模拟的多少次通过 Verify ,在 Verify 是调用模拟的 ,在模拟的传入参数指定在传入对应参数的时候,此调用了多少次 mock.Verify(func => 对象.Xx(模拟用户传入的是什么参数), Times.Xx在传入什么参数的时候被调用了多少次 Foo ,现在写一下 private void Foo(Func func) { var str = func(1); str = func(0); }此时的第一句调用 str = func(1) 通过 Times.Exactly 可以指定某个就被调用某次 mock.Verify(func => func(0), Times.Exactly(2));表示这个重来没调用过可以使用 Never 请看代码 mock.Verify(func => func(It.IsAny()), Times.Never);当然还有至少被调用多少次,最多被调用多少次等,这些很简单

    45340

    winform总结2> Action ,Action,func,委托相关的理解

    1,他们是什么:Action 封装一个,该不具有参数并且不返回值。Action 封装一个,该具有最多16个参数并且不返回值。 func 封装一个具有一个参数并返回 TResult 参数指定的类型值的。最多可以传递16个参数,并且可以有返回值,最后一个参数是返回值。 目前了解到的好像也只有委托是需要传递一个的,既然这里的三个式都是封装一个,那么这种写就肯定是可以用到给委托传递参数一类型的任务时用,想想刚开始学习委托的时候,要给他传递一个,还要再写一个去传递 funcTest);3,用在什么地:通过对这些东西的了解最直接的结果就是终于对一些的参数不再迷茫了. 最典型 lambda表达式中的那种写,实际上就是Func这个东西,看签名一目了然。然后就是可以将Func作为的参数,这样的话,就可以把被调用的具体的一部分操作权交给调用来执行。

    19520

    Spark Streaming 误用.transform(func)函数导致的问题解析

    SparkSpark Streaming transform 是一个很强的,不过使用过程中可能也有一些值得注意的问题。 另外还有一个问题,也是相同的原因造成的:我通过KafkaInputStream.transform 获取Kafka偏移量,并且保存到HDFS上。 DStream.compute 为什么会在generateJob的时候就被调用呢? 也就意味着所有transformation产生的DStream的compute都会被调用。 但是TransformedDStream 是比较特殊的,对应的func是会被执行的,在对应的compute里,你会看到这行代码:val transformedRDD = transformFunc(

    16530

    自定义类型和结构体 -

    学到什么什么是?如何调用?什么是值接收者和指针接收者?如何使用 new 函数?什么是私有和公有?概念上篇学习了什么是自定义类型,对于结构体也是自定义类型的一种,那是什么? 如果一个函数属于一个自定义类型时,那它被称为,类似于面向对象中给类增加格式在函数名前面写上自己所属的自定义类型后,这个函数就变为了该类型的名称的名称在类型的所有名称和所有字段名称中必须是唯一的。就算相同的名称一个是字段一个是名也是不可以的。 string Age int} func (p People) GetName() string { return p.Name}以上代码中定义了两个类型,每个类型分别携带了一个。 私有和公有名大写字母开头公有,小写字母开头私有。如果所在的包和调用者不是同一个,那私有是不能被调用的,只能调用公有。私有只能在同一个包内被调用。

    7220

    linq to sql中慎用Where(Func predicate),小心被Linq给骗了!

    于是写了以下测试代码,最终发现是Where(this IEnumerable source, Func predicate);使用后,导致这个问题的产生 1.测试表T_Test:CREATE TABLE nvarchar(3),@p2 int,@p3 int,@p0=20,@p1=N%J%,@p2=1,@p3=1 一切都很完美,跟我们想象的一样仅取了一条记录 3.但是,我们稍微把代码改一下:把Main中的前三行注释去掉 AS 即采用Where(Expression)式取数据时,居然先把所有数据取回来,再利用Expression来进行结果筛选以及SkipTake操作,真是令人大跌眼镜! (或许仅仅是我水平有限,理解不了而已),这样的式,在单表数据量很大时,性能当然极低。 恳请园子里的哪位linq达人,能解释一二? 知道了最终结果,处理自然也就明朗了,当时为了快速解决问题,只能把这类操作回归到最原始的SqlCommandSqlDataReader式读取,也许有更好的办,欢迎大家指点。

    29150

    no-func-assign 分别用 Eslint 插件和 Babel 插件来实现

    Eslint 有很多内置的 rule,其中有一个 rule 叫 no-func-assign,是指不能给函数赋值,目的是避免函数被重新赋值导致调用时出错。 思路分析目标是检查出对声明的函数的重新赋值,有两种思路:第一种思路是找到作用域中所有的函数声明,分析引用它的地,如果是赋值语句,就报错。 : disallow reassigning `function` declarations, recommended: true, url: https:eslint.orgdocsrulesno-func-assign 总结我们围绕着 no-func-assign 这个 Eslint 内置的 rule,分析了两种思路,分别用 Babel 插件和 Eslint 插件做了实现。

    5420

    Golang 语言标准库 syncatomic 包原子操作

    02 因为 Go (1.15)目前还没有支持泛型,所以每个 syncatomic 包提供的原子操作的,都包含不同类型的同名。但是不同类型的同名除了类型不同,使用是相同的。 细心的读者可能发现,为什么 Add 只支持 5 种类型,其它都支持 6 种类型,因为在 Go 语言中,指针是不能运算的,Add 是修改操作,其它否是存取操作。 Load func LoadInt32(addr *int32) (val int32)func LoadInt64(addr *int64) (val int64)func LoadUint32 Store func StoreInt32(addr *int32, val int32)func StoreInt64(addr *int64, val int64)func StoreUint32 func (v *Value) Load() (x interface{})func (v *Value) Store(x interface{})Load 的返回结果类型和 Store 的参数类型都是空接口类型

    21710

    golang 日志模块(log)

    log 日志log 模块可以自定义log 对象, 也可以使用log默认对象的日志func New 创建log对象func New(out io.Writer, prefix string, flag ( 10 ) func Prefix 获取信息前缀 func (l *Logger) Prefix() string logs.Prefix() func SetPrefix 设置信息前缀 func ( ..interface{}) func Panicf func (l *Logger) Panicf(format string, v ...interface{}) func Panicln func (l *Logger) Panicln(v ...interface{}) 使用模块 除了新建自定义日志对象,也可以直接通过log使用相关. 模块只是多出了 func SetOutput 用来设置日志输出log.SetOutput(os.Stdout)log.Println(run server) >>> 20190605 00:15:

    1.2K20

    swift底层探索 05 -深入探讨swift的调用机制swift底层探索 05 -深入探讨swift的调用机制

    图一1. struct-直接调用 要想知道是如何调用的,我是从是如何保存开始探索。 从看结构体没有像类那样的继承、metaData-ISA逻辑。而内存中也找不到的任何踪迹,存在哪里呢? 发现协议与普通调用是一样的机制:直接调用 1.3 struct + extension情况struct structModel{ var age : Int = 18 func structfunc1 在oc中method_list是一个二维数组包含:普通(包含父类)数组、类别数组.swift-vtableclass superClass{ func superClassfunc1(){} 在class中包含:父类,本类 不包含: 拓展 3.2 class + protocolprotocol Prot { func protocolFunc()}class classtModel 协议出现在vtable中,代表和普通一致是:函数表调用 3.3 class + entensionclass classtModel{ func classfunc1(){}}extension

    13930

    golang flag 命令行参数解析

    基础例子 注册参数port := flag.Int(p, 8080, server Port) 解析参数, 模块将使用 os.Args 做参数解析 flag.Parse()fmt.Printf(server 默认值(文本格式),用于使用信息 } FlagSet flag 设置对象 type FlagSet struct { Usage函数在解析flag出现错误时会被调用 该字段为一个函数(而非采用 ) Visit(fn func(*Flag)) func VisitAll 遍历所有参数,包括未设置 func (f *FlagSet) VisitAll(fn func(*Flag)) 模块除去新建和初始化 ,模块基本与对象一致, 部分配有默认值 Parse 模块的Parse 将调用os.Args 作为函数参数, 既该函数调用时不需要传参 func Parse() 总结flag 主要提供了一种参数解析式 flag 主要包含 对象的定义及工厂函数各类型参数注册信息获取函数模块默认提供命令行的快捷

    1.2K20

    扫码关注云+社区

    领取腾讯云代金券