技术开发 频道

.NET内存管理的非常好的实践

 这样重写之后将会自动调用Dispose函数,我们不需要直接调用它,因此对于快速资源解除分配最好使用Using程序块。

 也可以使用Try/ Catch程序块,如:

 try

 {

 SqlConnection con = new SqlConnection(connectionstring);

 try

 {

 SqlCommand cmd = new SqlCommand(sql, con);

 con.Open();

 cmd.ExecuteNonQuery();

 }

 catch {}

 finally

 {

 cmd.Dispose();

 }

 }

 catch(){}

 finally

 {

 con.Dispose();

 }

 }

 接着是使用as或is比使用强制类型转换要好,也就是说如果我们想转换一个类型,应该使用as关键字而不是使用明确的类型映射。

object o = new SqlConnection();

 SqlConnection con = o as SqlConnection; // Better to use this

 SqlConnection con = CType(o, SqlConnection); // Not always better

  在上面的语句中,如果你使用第二个转换语句,如果CType不能转换成那个类型或在o中有空值,它将会抛出错误,但在使用了as的语句中不会抛出错误,而是使转换无效。

 调用函数时使用Structure

 调用函数时参数少是一件好事,如果直接向函数发送一个大对象将会花大量的时间发送多个参数,此时可以为那些要发送的参数创建一个Structure,然后直接发送这个Structure。

public void Callme(int x, int y, string zy)

 public void Callme(argumentStruct st) // Better in performance

  发送一个Structure总比发送离散对象要好。

 使用一个大型组件总比使用大量的小型组件要好,大型组件中有许多命名空间,而不是大量的小型类库,微软也是这么干的,它将所有的组件都创建在mscorlib.dll中了,减少了元数据的负荷、JIT编译时间和安全检查等。

 如果不是必须的最好避免使用线程。

 通常情况下,使用大量的线程可能导致性能下降,因为每个线程在独立运行时会消耗大量的内存,当你需要快速处理时可以使用线程,但它会增加内存消耗。

 当你创建线程时使用ThreadPool(线程池)。

 避免使用ArrayList和HashTables,当你需要插入随机数据时可以使用链接数组。

 如果你看到ArrayList或HashTables的内部结构,就知道它仅仅是数组的打包,无论何时向这些结构中插入对象时,它将为所有已分配量重新声明,然后手动转变它们,ArrayList是一个对象数组,HashTable是一个结构数组。

 另一个奇怪的事情是,ArrayList或HashTables的区间系数是4,这意味着它无论何时需要内存时分配的内存总是4的倍数,当你需要随机插入时,LinkLists、Generic Lists和LinkedArrays比Collections对象的性能要好,当你需要添加数据和按顺序显示数据时使用Collections更好。

0
相关文章