面试题整理:C#(二)

时间:2021-10-03 04:34:46

1.类,接口的区别

从定义的角度
类描述一个实体,包括状态、属性和动作
接口定义一类动作,没有实现,也没有状态信息
从程序的角度
接口是函数声明;类是函数实现
接口可以有属性,不能有字段
一个子类只能继承一个父类,但是可以继承多个接口

2.接口和抽象类的区别

抽象类是一类事物的高度聚合,接口是定义行为的规范
抽象类定义方法时,可以有实现,也可以没有
接口中定义的方法,不能有实现
抽象类子类可以不重写抽象方法,继承接口的类必须有方法和属性的实现

3.抽象方法和虚方法的区别

抽象方法使用abstract关键字,虚方法是用virtual关键字
抽象方法必须被派生类重写,虚方法可以不重写
抽象方法可以看作没有实现的虚方法
类包含抽象方法,必须被定义为抽象类

4.Equal()、ReferenceEqual()、== 的区别

对于引用类型
Equal是比较引用的值是否相等
ReferenceEqual比较是否是同一个引用

Object a=new Object();
Object b=a;
Object c=new Object();       
Object d=new Object();
c=(object)100;
d=(object)100;

System.Object.Equals(a, b);           //return true
System.Object.ReferenceEquals(a, b);    //return true
System.Object.Equals(c, d);           //return true
System.Object.ReferenceEquals(c, d);    //return false

对于值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。

5.进程和线程的区别

线程时CPU调度和分配的单位,进程内可以有多个线程,共享进程资源

6.使用Operator的注意事项

需要提供public static修饰符;
需要有返回值;参数类型可以不同;==和!=必须成对出现

7.Task和ThreadPool的区别

ThreadPool不支持线程的取消,完成、失败通知等交互
ThreadPool不支持线程执行的顺序
Task有属性,可以查询任务完成时的状态(IsCanceled\IsCompleted\IsFaulted)
Task没有提供回调时间通知,通过启动一个新任务的方式完成类似的功能。
ContinueWith可以在一个Task完成时发起一个新的任务,支持了任务的完成通知,可以在新任务中获取旧任务的结果
ThreadPool可以节省创建销毁线程消耗的时间,减少内存浪费,和性能损失

8.Sealed关键字的作用

被Sealed类修饰的类和方法不能被继承和重写

9.能用foreach遍历访问的对象需要实现什么接口或者声明什么方法

不一定要实现IEnumerable接口,一定要实现GetEnumerator方法

10.构造函数是否可以被Override

不可以,构造器不能被继承,不能被Override,可以被Overload

TO BE CONTINUE...