首页 > 编程语言 > C#/.net面试知识点总结(三)【委托】

C#/.net面试知识点总结(三)【委托】

时间:2023-02-16 14:01:08浏览次数:37  
标签:返回 知识点 定义 委托 C# 参数 事件 类型 net

委托是什么?事件是不是一种委托?

委托可以把一个方法作为参数带入另一个方法。委托可以理解为指向一个函数的指针。

C#的委托是CTS(公共类型系统)规定的5种类型之一。(类类型,结构类型,接口类型,枚举类型,委托类型)。它类似于c或c++中的函数的指针。但函数指针只能引用静态方法。而委托既能引用静态方法,也能引用实例方法。委托是存在有对某个方法的引用的一种引用类型变量。(也就是委托类型)。引用可在运行时被修改。 C#的事件并不是委托的一种,事件(event)基本上可以说是一个用户操作,如按键,点击、鼠标移动等等。或者是一些系统生成的通知。事件使用的是发布和订阅模型。也就是说明事件的类为发布器。而需要对这个事件进行处理的类则为订阅器。那订阅器要怎么知道这个事件是否发生了呢?这个时候就用到了委托。委托负责告诉订阅器。事件发生了。并告诉他要调用哪个方法。委托其实是发布器和订阅器之间的一个桥梁。所以事件的实现依赖于委托,但事件并非是委托的一种。事件内部就是一个pivate的委托,加上 ADD和Remove两个方法。

委托是寻址的.NET版本。在C++中,函数指针只不过是⼀个指向内存位置的指针,它不是类型安全的。我 们⽆法判断这个指针实际指向什么,像参数和返回类型等项久更⽆从知晓了。

⽽.NET委托完全不同,委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对⽅法的 引⽤,也可以包含对多个⽅法的引⽤。理解委托的⼀个要点是它们的安全性⾮常⾼。在定义委托时,必须给出它所表示的⽅法的签名和返回类型等全部细节。理解委托的⼀种⽐较好的⽅式是把委托当作这样⼀件事情:它给⽅法的签名和返回类型指定名称。其语法类似于⽅法的定义,需要在定义⽅法的前⾯加上delegate关键字。定义委托基本上就是定义⼀个新的类,所以可以在任何地⽅定义类的相同地⽅定义委托,也就是说,可以在另⼀个类的内部定义,也可以在任何类的外部定义,还可以在名称控件中把委托定义为定义为顶层对象。访问修饰符可以是public/private/protected等。

.NET默认的委托类型有哪⼏种?

1. Action < T >

 泛型Action委托表示引⽤⼀个void返回类型的⽅法。这个委托类存在16种重载⽅法。

例如Action<in T1,In T2>调⽤没有参数的⽅法2.Func< T >

Func调⽤带返回类型的⽅法。有16种重载⽅法。

例如Func委托类型可以调⽤带返回类型且⽆参数的⽅法,Func<in T,out TResult>委托类型调⽤带有4个参数和⼀个返回类型的⽅法。

 什么是泛型委托?

 Action就是泛型委托。注意事项:

建议尽量使⽤这些委托类型,⽽不是在代码中定义更多的委托类型。这样可以减少系统中的类型数⽬,同时简化编码

如果需要使⽤ref或out关键字,以传引⽤的⽅式传递⼀个参数,就可能不得不定义⾃⼰的委托: delegate void Test(ref int i)

如果委托要通过C#的params关键字获取可变数量的额参数,要为委托的任何桉树指定默认值,或者要对委托的泛型类型参数进⾏约束,也必须定义⾃⼰的委托类型

delegate void EventHandler(Object sender, TEventArgs e) where TEventArgs : EventArgs;

使⽤获取泛型实参和返回值的委托时,可利⽤逆变与协变。逆变:⽗类转换为⼦类;协变:⼦类转换为⽗类

延迟执⾏ (Lazy Loading)是什么?

⼤部分LINQ语句是在最终结果的第⼀个元素被访问的时候(即在foreach中调⽤MoveNext⽅法)才真正开始运算的,这个特点称为延迟执⾏。⼀般来说,返回另外⼀个序列(通常为IEnumerable或IQueryable)的操作,使⽤延迟执⾏,⽽返回单⼀值的运算,使⽤⽴即执⾏。IEnumerable是延迟执⾏的,当没有触发执⾏时,就不会进⾏任何运算。Select⽅法不会触发LINQ的执

⾏。⼀些触发的⽅式是:foreach循环,ToList,ToArray,ToDictionary⽅法等

标签:返回,知识点,定义,委托,C#,参数,事件,类型,net
From: https://www.cnblogs.com/aikeming/p/17126426.html

相关文章

  • 10 张图解 K8S CNI Calico 网络模型原理与功能实战
    作者:liugp原文:https://u.kubeinfo.cn/4tRBTb一、概述Calico 是一个联网和网络策略供应商。Calico支持一套灵活的网络选项,因此你可以根据自己的情况选择最有效的选......
  • C#.NET上传大文件的三种解决方案
    ​ 以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传......
  • oracle的ASM扩容
    oracle的ASM扩容#查看服务器上总共有多少个asmdisk[grid@rkdb1]$asmcmdlsdsk--discoveryPath/dev/oracleasm/disks/OCPDATA1/dev/oracleasm/disks/OCPDATA2#......
  • 自己封装vue echart组件 方便调用
    <template><div><divref="lineChart":style="{width:width,height:height}"></div></div></template><script>importechartsfrom'echar......
  • 【LeetCode】15. 三数之和
    classSolution{public:vector<vector<int>>threeSum(vector<int>&nums){vector<vector<int>>result;sort(nums.begin(),nums.end());......
  • C# 字符串数组去重(去除数组中重复元素)
    1、去重distinct()或者GroupBy(p=>p).Select(p=>p.Key),去重的对象都需要为数组,具体看代码stringitemfileids="1,3,3,5,4,6,8,4,7,5,1,2";string[]sArray=itemf......
  • linux系统(centos7)安装gcc命令包(解压缩版)
    linux系统(centos7)安装gcc命令包(解压缩版)一、如果执行gcc–version出现以下信息,表示已经安装过gcc,可以跳过该步骤:[boco@CDH-143spark_job_monitor]$gcc--versiongcc......
  • .Net6 + GraphQL + MongoDb 实现Subscription监听功能
    介绍查询、添加、修改我们已经演示了,我们来看下订阅。订阅大家可以理解为音乐软件,我们用户=>订阅音乐频道<=服务发送新的音乐通知到频道。有新的通知进入频道后,频......
  • JavaScript体验
    JavaScript体验(来自本站javascript教程)JavaScript实例代码:JavaScript可以直接在HTML输出:document.write("<p>这是一个段落。</p>");JavaScript事件响应:<bu......
  • 编译和运行一个C++程序
    由C++编写的源代码需要经过编译和链接后,将其转化为可执行程序后才能运行.在C语言中,使用gcc命令来编译和链接C程序gccmain.c//编译单个源文件gccmain.cmodule.......