在介绍GC前,有必要对.net中CLR管理内存区域做简要介绍: 1. 堆栈:用于分配值类型实例.堆栈主要操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放.栈的执行效率高,但存储容量有限. 2 .GC堆:用于分配小对象实例.如果引用类型对象实例的大小小于85000字节,实例将被配置在GC堆上,当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩. 3. LOH:large object heap,用于分配大对象实例.如果引用类型对象的实例的大小不小于8500…
1 string与stringbuilder 并不是stringbuilder任何时候都在性能上占优势,在少量(大约个位数)的字符串时,并不比普通string操作快. string慢的原因不是string.conact(),而是string大量操作时,产生新的对象以及GC回收对象而造成的性能低下. stringbuilder使用前,最好估算一下大约的长度,否则默认16.每次超过长度后将自动翻倍增长. string.concat本质速度比stringbuider的append快,因为本质都是增加字…
void Method1(string str, object a){} void Method2(string str, object a,object b) { } void Method3(string str, object a,object b,object c) { } //合成一个方法 void Method(string str, params object[] a) { } 传参数时:Method(str,new object[]{})或者 Method(str,a1,a2,a…
差异:override:覆盖父类分方法,new 隐藏父类方法. 共同:都不能改变父类自身方法. public class Test { public string Name { get; set; } public virtual void SetName() { Console.WriteLine("parent"); } } public class Testchildren:Test { public override void SetName() { Console.Write…
多线程就离不开lock,lock的本质是一个语法糖,采用了监视器Monitor. lock的参数,错误方式有很多种,只需要记住一种:private static readonly object lockobj=new object();只要写这行代码就不会错了,其他的公共的,值类型,this等,就被排除了. 那么为什么不能使用是公共属性或者this呢? 因为你在代码里锁了this或者公共属性,而外部调用是也可能同样先锁住,这样内部代码一直等待外部释放,外部一直等待内部执行,就死锁了. using…
try catch 在不异常的时候不损耗性能,耗损性能的是throw ex,所以在非异常是,不要滥用throw,特别是很多代码习惯:if(age<0) throw new Exception("年龄不能小于0"),这种代码. 另外throw 有多种写法 try catch(ex) { throw ex; }这种代码是表示ex 已经被处理了,又重新抛出了ex异常,重置了错误信息,导致找不到真正的异常位置. try catch { throw } 直接抛出 try catch(Exc…
for 是索引器,foreach是迭代器 foreach在movenext()中增加了对集合版本(一个整数,每次对集合修改都+1)的验证,另外反编译后的效果是使用了using(是try finally的语法糖),调用了dispose() 性能上在一个级别,且一直有争议,暂不做结论,只在应用场景上做区别:不对集合做修改,为了代码美观使用foreach,修改集合用for.…
event 主要是给委托加了一层保护,不能任意的 class.delegate=null,class.delegate=fun1,不能由调用者去任意支配,而是由class自己去增加或减少,用+=.-=.…
invoke与begininvoke是同步委托和异步委托,但是有两种使用情况: 1. control中的invoke.begininvoke. 2. delegrate中的invoke.begininvoke. 在control中主要是解决跨线程访问UI的问题,当invoke时,子线程把方法交给主线程执行,并等待,直到主线程执行完后,子线程才继续往下执行,而begininvoke则是子线程把方法交给主线程执行,同时自己不等待,继续执行. 跨线程UI有两种写法: delegate void Saf…
Linq主要分为 Linq to object .Linq to XML .Linq to sql(现在都用EF了). 针对object和sql,微软分别设计了两套接口IEnumerable.IQueryable(其中IQueryable继承与IEnumerable), 针对LINQ to OBJECTS时,使用Enumerable中的扩展方法对本地集合进行排序和查询等操作,查询参数接受的是Func<>.Func<>叫做谓语表达式,相当于一个委托.针对LINQ to SQL时,则使…