解答“60k”大佬的19道C#面试题(下)
在上篇中,我解析了前10道题目,本篇我将尝试解析后面剩下的所有题目。
姐妹篇:解析“60k”大佬的19道C#面试题(上)
这些题目确实不怎么经常使用,因此在后文中,我会提一组我的私房经典“6k面试题”,供大家轻松一刻。
先略看题目:
11简述LINQ的lazycomputation机制
12 利用SelectMany实现两个数组中元素做笛卡尔集,然后一一相加
13请为三元函数实现柯里化
14请简述refstruct的作用
15请简述refreturn的使用方法
16请利用foreach和ref为一个数组中的每个元素加1
17请简述ref、out和in在用作函数参数修饰符时的区别
18请简述非sealed类的IDisposable实现方法
19delegate和event本质是什么?请简述他们的实现机制
解析:
11.简述LINQ的lazycomputation机制
Lazycomputation是指延迟计算,它可能体现在解析阶段的表达式树和求值阶段的状态机两方面。
首先是解析阶段的表达式树,C#编译器在编译时,它会将这些语句以表达式树的形式保存起来,在求值时,C#编译器会将所有的表达式树翻译成求值方法(如在数据库中执行SQL语句)。
其次是求值阶段的状态机,LINQtoObjects可以使用像IEnumemrable
这两种机制可以确保LINQ是可以延迟计算的。
12.利用SelectMany实现两个数组中元素做笛卡尔集,然后一一相加
//11.利用`SelectMany`实现两个数组中元素的两两相加 int[]a1={1,2,3,4,5}; int[]a2={5,4,3,2,1}; a1 .SelectMany(v=>a2,(v1,v2)=>$"{v1}+{v2}={v1+v2}") .Dump();
解析与说明:大多数人可能只了解SelectMany做一转多的场景(两参数重载,类似于flatMap),但它还提供了这个三参数的重载,可以允许你做多对多——笛卡尔集。因此这些代码实际上可以用如下LINQ表示:
fromv1ina1 fromv2ina2 select$"{v1}+{v2}={v1+v2}"
执行效果完全一样。
13.请为三元函数实现柯里化
解析:柯里化是指将f(x,y)转换为f(x)(y)的过程,三元和二元同理:
Funcop3=(a,b,c)=>(a-b)*c; Func >>op11=a=>b=>c=>(a-b)*c; op3(4,2,3).Dump();//6 op11(4)(2)(3).Dump();//6
通过实现一个泛型方法,实现通用的三元函数柯里化:
Func>>Currylize3 (Func op) { returna=>b=>c=>op(a,b,c); } //测试代码: varop12=Currylize3(op3); op12(4)(2)(3).Dump();//(4-2)x3=6
现在了解为啥F#签名也能不用写参数了吧,因为参数确实太长了