C#面试题记录
最怕的就是面试,每每到找工作的时候感觉压力山大,每次都要提前刷点题目去面对。所以这里自己对以后需要了解的知识做一个记录,方便自己随时的补充和深入了解,也给现在的自己留下一点点的印记,给未来留下一点回忆。
下面进入到正题,其实在面试的时候我们往往都会被问到一些C#基础的知识,其实就和之前听过的一句话所说的,“它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了”,的确!很多东西就是这样子,尤其对于我个人来说更加是这样子,如果有实践的实现和应用,我能够把这个东西理解的稍微透彻一点,说起来也能够表达出自己的一些看法,但如果是一些只听说过,用的不是很深的东西,每每一些基础点,只能够大概的讲出他的官方定义,在深入可能满脑子都是问号了!所以就想通过这篇文章记录一些面试过程中会常碰见的问题,熟悉的自己讲一讲自己看法,不熟悉的先记录下来,然后慢慢的去补充。
1.委托和事件
a.委托
关键字:delegate
基础定义:C“运行时“的qsort函数获取指向一个回调函数的指针,以便对数组中的元素进行排序。在Microsoft Windows中,窗口过程,钩子过程和异步过程调用等都需要回调函数。在.Net Framework中,回调函数的应用更是广泛
个人理解:其实单从这个基础上面定义来说比较简单的,主要应用的场景主要是在一个方法,有一个参数的值是需要传递另外一个方法,然后使用这个传入的方法。如果在js中大致的把这个理解为回调函数,回调函数的也是把方法名作为参数传递,但是因为js定义方法的时候不需要对这个传入的方法进行修饰,直接一个名称定义就可以了,但是在C#的方法定义的时候需要对这个传入的参数进行定义,比如是int,string,实体,等等,所以在这里出现了委托delegate修饰符,定义一个delegate修饰的委托,然后作为修饰符修饰需要传递的方法。个人的暂时理解是这样的,如果理解错了,请大家指出。(后面翻了一下CLR via C#关于委托的说明,表示有点懵,讲得很底层也很深入,感觉我理解的要怎么去用!而书里讲的是为什么是这样,实现的机制以及原理是什么,产出的1L代码是怎样的!)
namespace 委托与事件 { class Program { static void Main(string[] args) { Console.WriteLine(GreetPeople("张三", ShowChinese)); Console.WriteLine(GreetPeople("zhangsan", ShowEnglish)); Console.ReadKey(); } /// <summary> /// 中文问好 /// </summary> /// <param name="name"></param> /// <returns></returns> public static string ShowChinese(string name) { return name + ",你好!"; } /// <summary> /// 英文问好 /// </summary> /// <param name="name"></param> /// <returns></returns> public static string ShowEnglish(string name) { return name + ",hello!"; } /// <summary> /// 定义一个委托 /// </summary> /// <param name="name"></param> /// <returns></returns> public delegate string Show(string name); //注意此方法,它接受一个show类型的方法作为参数 private static string GreetPeople(string name, Show show) { return show(name); } } }
2.事件
关键字:event
基础定义:定义了事件成员的类型允许类型(或类型的实例)通知其他对象发生了特定的事情。例如Button类定义了Click时间。应用程序中的一个或多个对象可以接收关于该事件的通知,以便在Button被单击之后采取特定的操作。我们用事件这种类型成员来实现这种交互。具体地说,定义了事件成员的类型能提供一下功能
方法能登记它对事件的关注
方法能注销它对事件的关注
事件发生时,登记了的方法将会收到通知。
个人理解:对于事件的理解主要停留在Button按钮的点击事件,做窗体程序,webFrom程序的时候,每添加一个Button的时候,在双击它的时候,后天的cs页面就会注册一个点击事件
,点击这个按钮查看属性的时候也会在事件这个属性中看到按钮的Click事件被注册了button1_Click这个方法,其实从这个例子可以推理一下,当前是注册了单击按钮这个行为到事件,扩展一下同理的可以注册事物的其它的行为到事件,所以个人在这里就这样理解,事件就是给某一个事物注册了某一个动作或者行为,这个动作或者是行为在收到某个指令的时候会发送。在这里联想到了机器人,当机器人收到了某一个命令,肯定会先去解析这个命令,然后转换成指令,然后去执行相对应的动作,在这里就可以把这些机器执行的动作当做是程序事先给机器注册的事件。(感觉说的有点偏,如果理解的不对,还望能够指出)
这里非常推荐一篇文章:C# 中的委托和事件
2.关于int类型的长度,占多少字节(ps去年碰到的一个试题,到现在都还印象深刻)
其实这问题有一个条件没有补充完整,所以回答的时候得自己补充完成。
主要的int类型有Int16,Uint16,Int32,Uint32,Int64,Uint64
short System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -2^15 ~ 2^15-1)
ushort System.UInt16 (无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 2^16)
int System.Int32 (整型,占 4 字节,表示 32 位整数,范围 -2^31 到 2^31-1)
uint System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 2^32)
long System.Int64 (长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方)
ulong System.UInt64 (无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 大约 10 的 20 次方)
补充一下其他的类型
bool System.Boolean (布尔型,其值为 true 或者 false)
byte System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)
sbyte System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)
char System.Char (字符型,占有两个字节,表示 1 个 Unicode 字符)
float System.Single (单精度浮点型,占 4 个字节)
double System.Double (双精度浮点型,占8 个字节)
暂时先写这两点了,之后有时间在补充。