剩下十天左右时间,准备一下笔记题,也巩固一下基础知识。本想万一找不到合适的就在家脱产学到过年算了,后来想想确实没必要,就算年前不好找工作,无非是钱多钱少、路远路近的问题。实在找不到满意的,可以先凑合着工作两三个月,到转正时如果薪资什么的还达不到要求,到时年初比较好找工作。
对着书也看不出什么来,就在网上找找笔试面试题,简单的看看就算了,有些经典的有代表性的,随手记录下来。
主要是看园内”汉城节度使“去年四月的长文,边看边记一些感想,有一些复制和删改。其余查的资料就不一一标明出处了。
一、喜闻乐见的四大访问方式
private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 当前程序集内可以访问。
其它都好理解,但这个程序集经常看到,具体说不上来。。。找到几篇资料,汇总一下,大概了解了。
protected限定的是只有在继承的子类中才可以访问,可以跨程序集 internal限定的是只有在同一个程序集中才可以访问,可以跨类
对于一些大型的项目,通常由很多个DLL文件组成,引用了这些DLL,就能访问DLL里面的类和类里面的方法。 比如,你写了一个记录日志的DLL,任何项目只要引用此DLL就能实现记录日志的功能,这个DLL文件的程序就是一个程序集。
情形一:比如MyCompany.MyProject.DAL里的若干个.cs文件,编译得到DAL程序集,而MyCompany.MyProject.BLL里的若干.cs文件,编译得到BLL程序集。 情形二:同样是MyCompany.MyProject.DAL空间里的,我可能有一个用于支持SQL Server的程序集DAL_SQLServer.dll,可能还有一个支持Oracle的程序集DAL_Oracle.dll。 命名空间与程序集没有一一对应的关系,关键还是看你的项目组织和输出
二、页面传值
1、可以通过url(增加&name=123&mail=abc.com之类)
2、可以通过cookie(先在这边存好cookie,到了新页面再取相应的cookie)
3、可以通过Session(和cookie类似,区别在于cookie是浏览器端的,用js就能实现。而Session是服务器端的,如果是静态页面,要用ajax去服务端取。另外,高并发时Session可能会丢失)
4、通过Cache(用的比较少,和Session类似,但Sesseion是会话级别的,Cache的应用程序级的。一般重复的、公共的用Cache, 单独的、私有的用Session)
三、堆/栈、值/引用、结构/类、装箱/拆箱
这几种东西翻来翻去都是玩一个概念,就是两种基本存取类型,应该也是比较爱考的。
1、堆/栈、值/引用:
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。 堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。 3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型。 4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
按我理解,引用类型放在动态分配的内存(堆)中,只存取地址的取用。值类型是实实在在的值,放在规划好的内存空间(栈)中,存取的是具体的值。
奇葩点1:所有的值类型都继承自System.ValueType。而System.ValueType却是一个引用类型。
奇葩点2:String类型直接继承自Object,这使得它成为一个引用类型。一个字符串一旦被创建,我们就不能再将其变长、变短、或者改变其中的任何字符。
给字符串赋值其实相当于是重新生成一个新字符串,所以在大循环中,要用StringBuilder来代替String。
2、结构/类
Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。 Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。Int32、Boolean等都属于结构体。
平时常用的都是类,结构比较少用。类肯定是引用的,记住了类,知道结构是和它反过来的就容易记了。
3、装箱/拆箱
装箱:从值类型接口转换到引用类型。 拆箱:从引用类型转换到值类型
装箱就是把一个值类型直接赋给object类型。
拆箱反过来,但要加个显式的强制转换,像(int) obj,转换失败还会报错
四、.NET/C#
这也是老生常谈了。
.NET是一个平台/框架,号称是支持所有语言,全都可以拿到CLR来编译。但实际上除了自家的C++、VB、C#、F#之外,没见到其它公司什么语言整合进来,占大半江山的PHP和JAVA就更不可能放在.NET里面了(就算技术上行的通,人家也要百般阻挠啊,不然全都在你这玩了,其它人全喝西北风啊),所以还是个自娱自乐的货。
C#就是一些if、while、加减乘除、定义变量之类非常基本的语法,稍高级一些的各种方法,都是.NET框架的
五、GC垃圾回收
1、一个对象没有被任何对象引用时,就会被回收,但不是马上回收,而是由GC垃圾回收机制根据一定规则来处理,可手动运行GC.Collect()强制处理一下。
2、非托管资源GC不会回收,必须手工回收。如FileStream就要调用Dispose()回收,可使用using(){}来自动回收。
六、try/catch/finally
一个经典的坑就是try里面的return和finally
static void Main(string[] args){ Console.Write(GetIt()); } static int GetIt(){ int i = 1; try{ i++; Console.Write("a"); return i; } finally{ Console.Write("b"); i++; } }
输出的是ab2,因为finally会在try执行完后仍然执行,即使try有return,也会“卡”在那里等finally执行完,并且不影响return的值。
所以,通常在finally中执行Dispose(),这样,即可以保证不管报不报错都会释放资源,而且不影响return要用的值(会暂存起来),否则在return前就Dispose()了岂不是会报错?实际上并不会
七、