近期碰到的一些面试题--WPF、C#、数据库
WPF相关:
1.定义依赖属性需要注意哪些地方?
(1)依赖属性的名字必须以Property结尾。
(2)如果不需要监听属性值的变化,不需要绑定,可以用PropertyMetadata,避免性能的浪费。
(3)对依赖属性值的变化监听应该使用回调,而不是写在属性构造器里面。因为对依赖属性的赋值,不一定会走属性构造器。
2.Invoke和BeginInvoke的区别。
(1)Invoke是同步的,将消息丢入消息泵后会等到消息被消费完才会返回。
(2)BeginInvoke是异步的,将消息丢入消息泵后直接返回。
两者在使用区别上,主要是看后续的代码是否需要异步进行。比如说,后台有上百张图片文件需要读取并显示到界面上,则可以将读取的操作放入子线程中操作,将生成BitmapSource通过BeginInvoke推送给UI线程去显示,可以不影响后续其他文件的读取。如果这个地方使用Invoke,则可能会需要后续其他文件的读取效率。
3.ControlTemplate 和DataTemplate的区别。
ControlTemplate定义控件的外观,DataTemplate定义数据展示的外观。
4.WPF和Winform有什么区别?
winform 的界面绘制是基于GDI的,程序启动速度快,适合敏捷性开发。WPF是基于DirectX,依赖硬件,可以发挥硬件加速。对于大型项目来说,WPF要比Winform性能更好,界面能够高度定制。
C#相关:
1.接口和抽象类的区别。
(1)接口没有构造函数,不能有字段变量,不能定义每个方法的访问权限,方法必须是抽象的,没有函数体。
(2)抽象类可以有构造函数,可以有普通的字段变量,可以定义每个方法的访问权限,方法可以是非抽象的,可以有函数体。
2.说下CLR的内存管理机制。
CLR的GC使用的是引用跟踪算法(不是引用计数!),每次GC开始时会从一个根开始沿着对象引用的链路去查找链路上所有对象的引用,找到该对象的引用,则将该对象的内存标志字段设为1。遍历结束,会将所有标记字段为0的对象清除,并将幸存对象压缩,清除内存碎片化。
其中的根,可以是全局对象和静态变量的引用,形参的引用,局部变量的引用,还有所有对象引用的CPU寄存器。
再深入一些,可以讲GC的0代,1代,2代。0代就是内存堆初始化时生成的对象,初始大小为256KB,当0代即将超出容量的时候,会进行一次GC,将幸存的对象转入1代,并将0代扩容。1代初始大小为2M,当即将超出容量的时候也会进行一次GC,将幸存对象转入2代,并将1代扩容。2代的初始大小为10M,当二代即将超出容量的时候进行一次GC,并将2代扩容。此时2代的幸存对象不会升入3代,2代的垃圾回收即是完整回收,会回收所有代的对象。
这样做的好处是可以提升垃圾回收的性能。
另外,可以触发GC的几种情况:
(1)主动调用GC.Clloect()方法,并不推荐这种主动调用的方式。
(2)系统报告低内存。
(3)CLR卸载AppDomain
(4)CLR正在关闭,应用程序退出。
3. EF中的AsEnumerable和AsQueryable 的区别
AsEnumerable是现将数据加载进缓存再进行处理,消耗更多的资源提升查询效率。AsQueryable 是现将操作翻译为Sql语句操作数据库。
如果是查询操作比较多,可以用AsEnumerable。如果是一次性获取较多的数据集,则优先使用AsQueryable 。
4.引用是指针么?有什么区别么?
引用本质上是指针,但是引用≠指针。引用在初始化的时候已经确定了类型对象,创建之后无法再变更到其他类型对象上,而指针可以指向任何对象的地址。
5.new 关键字有哪些用法?
1.运算符,创建对象
2.修饰符,隐藏基类中的继承成员
3.用于泛型类型中的类构造函数约束
6.new 关键字创建对象的时候做了那些事情?
1.计算类型及其所有基类字段所需要的内存,其中包括同步索引块和类型对象指针所需要的内存。
2.在托管堆分配内存。
3.调用类型的构造函数并传参,初始化字段,同步索引块,类型对象指针。
4.返回地址引用。
7.设计模式的几大原则。
职责单一原则,开闭原则,依赖倒置原则,迪米特法则,里氏替换原则,接口隔离原则,合称复用原则。
8.说下C#代码从编译到执行的过程。
本地编译器会先通过clc.exe把C#代码编译成程序集(dll/exe),包含中间IL语言代码和元数据表,当程序启动,CLR加载程序集的时候,会读取元数据表并将IL语言编译成机器语言,并将编译后的机器语言保存到本地缓存中,用于重复调用同一个程序集时避免重复编译。
9.Web API 开发过程中需要注意的问题。
1.考虑是否需要鉴权--jwt。
2.全局的异常处理,可以使用中间件。
10.事件和委托的区别:
1.委托是一种类型,事件是一种特殊的委托,对委托的包装。
2.事件修饰的是对象,只能在类的内部调用,委托可以在类的外部调用。
3.事件使用关键字event,委托使用关键字delegate,事件只能去订阅,无法赋值,委托可以赋值且订阅。
11.泛型约束:
1.值类型约束 2.构造函数约束 3.转换类型约束 4.引用类型约束 5. 组合约束
数据库相关:
1.什么是脏读,不可重复度,幻读?
脏读:一个事务读取了另一个事务已经修改但还未提交的数据。
不可重复度:同一个事务多次执行同一条查询语句,得到的行结果可能不一样。
幻读:同一个事务多次执行同一条查询语句,得到的数据集结果可能不一样。
2.事务的隔离级别?
1.未提交读:最不安全的隔离级别,允许脏读,不可重复度,幻读
2.提交读:不允许脏读,允许不可重复度和幻读
3.可重复度:不允许脏读,不可重复读,但允许幻读
4.串行:安全级别最高,不允许脏读,不可重复读,幻读,但执行效率最低
3.Mysql中的MVCC是什么?解决了什么问题?
MVCC,多版本并发控制,快照读,给每一个执行事务创建某个版本的数据镜像,在不使用数据库锁的情况下解决不可重复读的问题,提高数据库的并发性能。
后面想到了会继续补充。