CLR托管环境扮演了垃圾接纳的角色,所以你不须要显式开释已建立对象所占用的内存。但这不意味着你能够疏忽一切的运用过的对象。很多对象封装了其 他范例的体系资本(比方,磁盘文件,数据衔接,收集端口)。坚持这些资本的运用状况会急剧的耗尽体系的资本,减弱机能而且终究致使顺序失足。当你翻开一个 文件、收集端口或许数据衔接时,当你不再运用这些资本时,应当尽快显式开释这些资本。
别的针对资本的操纵,平常须要增添非常捕捉处置惩罚(Try..Catch),这时刻别忘记在finally中举行资本开释,以确保在捕捉非常时也能够一般开释资本。
2 准确住手多线程
FileStream fs = File.Open(…);
Try{…} Finally{ fs.Close;}
假定如上代码在事情线程中,已举行到finally内里,这个时刻UI线程挪用了该线程的Abort()要领,则很有能够fs.Close还没有实行的时刻,事情线程跳出finally代码块了。如许你的fs就永久不会被Close了。
大多数情况下,finally会永久被被实行,但不包含挪用Thread.Abort所激发的ThreadAbortException非常,鉴于此来由,不发起运用Abort。
要准确住手线程,不在于挪用者采纳了什么行动(不要直接运用Thread.Abort()),而更多依靠于事情线程是否能主动相应挪用者的住手要求。
大致机制是,如果线程须要被住手,那末线程自身就应当担任给挪用者开放Cancel的接口。
3 范例转换相干
如果从数据库中读取某个值,有数据时是int范例,没有数据的话获取到的是null,范例强转则会非常。所以平常很罕用强转,用的话也必需做一个非常捕捉,防止顺序非常。
在强转不好的情况下,我们发起运用TryParse要领,该要领已对Parse要领举行了非常处置惩罚。
也能够用Convert,一样须要举行非常捕捉;实在,通常触及到范例转换,序列化等操纵的处所,都须要捕捉非常;
4 字符串操纵题目
在对字符串操纵中,若触及大批拼接操纵发起运用StringBuilder。若运用String会带来显著的机能消耗。缘由在于string对象是 个很迥殊的对象,它一旦被赋值就不可转变。在运转时挪用String类中任何拼接操纵(如赋值、”+”等),都邑在内存中建立一个新的字符串对象,也意味 着要为该新对象分派新的内存空间。
5 const常量修正致使的题目
当顺序援用其他dll中的const常量时要迥殊引发注重。
若修正了此dll中的const常量后,要从新编译援用了此dll中这个const常量的一切顺序,不然顺序中运用的这个常量值将和dl中的不一致。
别的如果运用readonly替代const能够处理这个题目,不须要从新编译,由于const是编译型常量,而readonly是运转时常量。
6 C#编译目的平台题目
当顺序依靠的dll的编译的目的平台是X86,则顺序自身的编译目的平台也必需是X86(而不是默许选项Any CPU),不然64位电脑将没法运转。
7 跨线程接见控件
在开辟界面顺序时,会碰到比较耗时的操纵,为了顺序的友好性,我们平常会在使命线程中实行耗时操纵,并将实行信息显现在主UI线程。
如果直接在使命线程中操纵主UI线程中的控件,如许极易涌现非常,报“不能在其他线程中修正建立控件线程的值”,如果设置了制止编译器对跨线程接见做搜检,就不会报错,然则会涌现没法预知的题目。此时发起采纳托付或匿名托付的体式格局完成。
以上就是C#/.NET易错的几点的细致内容,更多请关注ki4网别的相干文章!