1.数据库的范式
这算入门问题了吧,但凡是个数据库类的,都得问吧,
但我们在回答的时候开始背书啦
第一范式(1NF)无重复的列
第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ]
第三范式(3NF)属性不依赖于其它非主属性 [ 消除传递依赖 ]
还有什么BCNF,是不是看了好像十分清楚,但不看又好像懵懵懂懂的。
说个我的记忆方式吧
第一范式,1NF,无重复列,字段不冗余且必不可少。这必须得记住
第二范式,2NF,满足第一范式且表必须有主键
第三范式,3NF,满足第二范式且表引用其他表必须通过主键引用
以上是不是好些了呢,这个时候你以为回答完毕就又被面试官给逮着了,你提到了主键了吧
开始扩展问了,数据库建立主键的原则
我们常常会蒙,原则,什么原则,不就是我们常常用到的ID,自增长吗,唯一性,好像没什么原则吧。
其实很多在日常的工作中我们已经注意了,只是不知道如何描述
关于原则内容内容,可以拜读:http://www.cnblogs.com/studyzy/p/3309350.html
分析得十分透彻,特别是其中提到的 《数据库主键与业务主键》。可以用此和面试官好好谈谈,这样会显得你对此有深入的研究,提升自己的实力形象
提到主键,就会继续发展到索引,随便问个数据库有哪几种索引,这个基础吧
A)聚集索引,表数据按照索引的顺序来存储的。
B)非聚集索引,表数据存储顺序与索引顺序无关。
关于索引:http://kb.cnblogs.com/page/45712/
继续往下问的话就是数据库优化方面来,横向分区,纵向分表
这可以参考:http://www.cnblogs.com/yukaizhao/archive/2010/05/31/sql-server-table-split-partition.html
以上我都点到即止,会的同学,会心一笑即可,不会的同学,愿意的,复制链接去看看吧,能增强内力的
最后推荐一篇SQL Server高性能写入方面的文章:http://kb.cnblogs.com/page/156213/
2.C#中,值类型和引用类型的区别
很多时候,我们由于没有把这个底层问题搞清楚,导致我们的程序看起来好像是对的,但运行的结果不符合我们的期望
百度的这篇文章:http://jingyan.baidu.com/article/7082dc1c524b14e40b89bd6d.html
很形象的解释了值类型和引用类型以及堆和栈,你还记不住什么是堆的话,文章中的三角形一样的图片,那是个堆的形状吧,形意结合,是不是清楚了很多。
记得要补充,不同的值类型,在栈中分配的空间大小不一样。不同的引用类型,在栈中分配的空间上一样的,在堆中空间不一样
C#的所有值类型均隐式派生自System.ValueType:
如 Sbyte,byte,short,int,long,DateTime,ushort,unit,ulong,char,float,double,decimal,bool,struct,enum,还有可空类型,如int?是值类型
引用类型:数组,类,接口,委托,Object,String
例外情况来了,一定要说:值类型的实例会存储在栈上,但是,当某个类的实例有个字段是值类型,那么实际该字段会和类的实例保持在同一个地方,即堆上。是不是突然高大上了
别慌,这个只是入门,面试官开始扩展了
String 能不能继承!!!
F12我们发现,string是被sealed修饰的。
英文不好了吧
sealed :密封,
故名思义,就是由它修饰的类或方法将不能被继承或是重写。
再继续追问下去就可以扩展到诸如override,和overload等等方面的关键字上面了
关于override 和 overload 参考:http://www.cnblogs.com/netlyf/archive/2009/09/08/1562642.html
还有如Final,finaly,finallize的区别
final 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 一句话:final修饰类时:没有祖先的光棍(不能继承也不能被继承),final修饰变量或者方法时:固定的,只能拿来用,不能改。
finally 在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)
3、finalize 方法名。使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
PS,摘自网络
Final并不是一个C#中的关键字,但经常在C#面试题中出现,例如说说“Final、Finally、finalize的区别”,其实这已经超出C#的范畴,这三个关键字分别考核了J#、.Net 容错方法、.Net垃圾收集机制,奇怪的是,每次我面试C#程序人员时,大部分人员对Final这个关键字并无陌生之感,相反却答得头头是道,看来来面试之前,早在网上有所预习,呵呵。