C#常见面试问题

一、抽象与接口的区别:
1,抽象(abstract):
(1)抽象类中可以有抽象方法,也可没有;
(2)抽象方法包含实现,也可以由子类实现;
(3)抽象类不能被sealed修饰,只能使用abstract关键字
(4)抽象方法不能在抽象类外部声明;
(5)抽象类只能单继承;
(6)可以有虚方法(virtual),在不同的继承中,可以有不同的实现(需要override重写);
2、接口(interface):
(1)接口比抽象类更抽象;
(2)可以多继承;
(3)不包含方法的实现,只能由子类实现;

二、多态:
概念上:一个接口多个功能
静态多态性:方法重写和运算符重写实现,编译期间实现;
动态多态性:由抽象和虚方法实现,运行期间实现;

三、C#-using用法:
(1)引入命名空间:using system;
(2)创建类或命名空间的别名:using Project =system.project;
(3)using语句中的对象只能实现IDeposeable接口,然后调用接口中的Dispose方法释放此对象;

四、反射(reflection)
概念:反射程序访问,检查并修改自己的一种能力;
反射封装了程序集,模块,类的信息。可以在程序运行时动态创建类的实例,并将其绑定到现有对象,由当前对象访问类,然后调用其方法或访问字段和属性;
优点:
(1)提高程序的灵活性
(2)降低程序的耦合度,提高代码的复用性;
(3)允许程序创建和控制任何类型的对象,不需要提前编码
缺点:
(1)程序的逻辑模糊:在调试程序时候,我们需要清晰看到程序运行的内部逻辑,而反射绕过源代码,因此,程序的可维护性降低;
(2)性能问题:反射是一种解释操作,在访问字段和属性时比直接接入代码要慢,造成程序的性能降低;
用途:
(1)允许程序 运行期间查看特性(attribute)信息,审查元数据;
(2)允许查看类的信息,并创建类的实例;

五、静态构造器与构造器区别:
1,静态构造器:
(1)用static修饰,不能出现访问修饰符:
**public class C{
public static b;
static C ( ){
}
}**
(2)用来初始化静态变量,在静态变量被调用或者进行实例化的时候调用,有系统调用;
(3)必须是无参的

2,(普通)构造器:
(1)用来初始化对象(类的实例);
(2)可以有修饰符,不能有static;
*public class C{
public int b;
public C ( ){
}
}*

六、委托(delegate)和事件(Event):
委托:
(1)委托类似一个指针变量,在委托声明时就已经规定了变量只能指向特定参数和特定返回值的方法,
(2)声明委托:delegate void mydelegate(); 使用new关键字实例委托;
(3)Invoke方法同步调用对应的委托对象方法,BeginInvoke,EndInvoke方法异步调用对应的委托对象方法;
(4)委托链里两个方法,Method用于获取委托调用的方法,Target用于获取当前调用的类的实例;
(5)委托分为:有返回值委托,无返回值委托,多路委托(委托链),委托逆变,委托协变,泛型委托;
事件:
(1)事件给委托提供了良好封装性,一方面它允许从类的外部添加、删除绑定的方法,另一方面,不允许从类的外部来触发绑定的方法;

七、集合:
ArrayList(动态数组):有序的集合,根据索引遍历;
Hashtable(哈希表):可根据键/值来访问集合中元素;
SortedList(排序列表):ArryList和Hashtable组成,根据索引和键来访问;
堆栈(Stacks)、队列(Queue)、点阵列(BitaryList):二进制数组,根据索引访问;

八、多线程(Thread)
(1)线程被定义为程序执行的路径;一个线程执行一个任务,例如计算机操作系统中并行编程的实现。节省CPU周期的浪费,提高程序运行的效率;
(2)线程死锁:死锁也称假死,是指程序依旧在运行,只是停留在某一环节没有继续执行。原因:当两个线程运行时同时需要对方的资源的时候,就会陷入相互等待之中,此时程序就是假死状态;
解决办法:进行死锁检测,然后挂起一些线程,释放与回收一些资源,让另外线程先执行;
(3)阻塞和非阻塞:当一个线程需要的资源被占用时,便陷入阻塞状态,这个线程必须等待,直到资源可用时继续执行。当我们需要运行另外一个线程b时,可以调用Thread.Sleep()将当前线程a阻塞掉,等b线程执行完,在唤醒线程a。
(4)Lock():保证当前块执行完毕,可解决阻塞问题;注:被lock的对象一定要引用类型的,否则报错!!!;

九、网络编程和通信
(1)TCP/IP协议:可靠,有效,可连接
(2)UDP协议:无连接,不可靠
(3)Socket套接字通信流程:创建Socket——>(Bind)绑定IP/端口——>添加监听(Listen)——>接收(Receive)——>发送(Send)

你可能感兴趣的:(C#,Blog)