代码改变世界

很简单的异常处理,不过一些细节你注意了吗(一):终止处理

2012-01-05 14:08 by PeterWang2004, 561 阅读, 1 推荐, 收藏, 编辑
摘要:try{...}finally{...}代码块已经在我们的日常开发工作中大量的使用,甚至在.net 2.0中出现了using语句来简化try{...}finally{...}操作。这种编程方式在windows编程中我们把它叫做“终止处理”。当try语句中发生异常时,线程不会立刻停止,而是会执行finally中的代码后再停止(没有异常恢复的情况,即没有Catch,本篇讨论的都是try{...}finally{...}),正因为如此,我们常常在finally中,做一些简单的操作,比如释放资源。但有下面几个问题,不知朋友们在开发过程中,注意过没有。0.测试语句如果没有特别说明测试代码,均以下面这段. 阅读全文

闲谈StringBuilder

2011-12-14 14:51 by PeterWang2004, 2036 阅读, 4 推荐, 收藏, 编辑
摘要:大家都知道StringBuilder在拼接大量字符串的时候相对String来说具有很高的效率,这是由于StringBuilder在内部处理上使用了字符串的链式存储表示法(串的块链存储法)。串的块链存储结构的C代码是这样的:#define CHUNKSIZE 80typedef struct Chunk{ char ch[CHUNKSIZE]; struct Chunk* next;}Chunk;由此,可以看到它同时具有数组和链表的特性。我们可以类比的想象一下,把上面的代码改写成下面的C#代码:class StringBuilder{ private char[] ch; priv... 阅读全文

利用现有框架定制表达式树分析器

2011-07-27 15:28 by PeterWang2004, 369 阅读, 0 推荐, 收藏, 编辑
摘要:我们在做数据库应用程序时,为了业务的需要,常常把Where条件以及Orderby子句当作参数,传递到SQL语句或者是存储过程中。这样难免就会涉及到很多字符串操作。当我们的数据库字段发生改变时,我们就会改很多的代码,造成很多不必要的操作,而且,字符串拼接老是会出现一些琐屑问题,比如,SqlServer中,需要将字符串用单引号的方式包起来。用一个英文单词来描述上面的这些问题——"error-prone"。那么,该如何减轻这种痛苦呢? 以前,我是这样考虑的,思想如下:将所有where条件句中的谓词对象化,然后使用Visitor模式,进行遍历生成对应的SQL语句,虽然用了它做了很久 阅读全文

浅析匿名方法中的局部变量

2011-07-18 14:30 by PeterWang2004, 461 阅读, 2 推荐, 收藏, 编辑
摘要:在上一篇文章中,我讨论了如何使用表达式树来柯里化一个函数。鹤老师提出了一个很简单的解决方法,那就是使用闭包。的确,经过我的测试,无论在性能或者是表现方式上都超越了使用表达式树,这是因为在表达式树组装过程中使用了反射。感谢鹤老师在这里给出的答案,但是细想一下,还是发现使用闭包来做柯里化函数(使用C# 4.0),可能会存在一些风险,这主要是涉及到闭包中局部变量的问题。 我相信大学习Linq的时候,一定听过“什么叫做延长局部变量生命周期”的言语。今天我主要就是要说明下这个问题,但要澄清一点,我绝对没有反驳鹤老师的意思。只是为大家分享一些开发中可能出现的问题,多一种选择,则多一份收获。 那么,首先来. 阅读全文

C#中的函数柯里化

2011-07-16 14:32 by PeterWang2004, 2556 阅读, 3 推荐, 收藏, 编辑
摘要:函数柯里化是函数式编程的一个特性,在函数式编程中,函数被认为是一等公民。可是C#作为一种混合语言(由于,可以在C#中使用函数式编程的原因,我个人认为它是一门hybrid语言)也可以通过delegate来描述一个函数,但如果我们调用时指定的参数个数不等于这个delegate的参数个数,则会在得到一个异常。 在进入讨论之前,我先定义一个函数: static int Accumulation(int baseSum,int count) { for (int i = 1; i <= count; i++) { baseSum+= i; } return baseSum; } 这段代码地球人都看 阅读全文