代码改变世界

随笔分类 - C#

计算一个数字有多少种排列可能

2012-02-03 09:14 by 空逸云, 1902 阅读, 收藏, 编辑
摘要:现有一数字,例如12345,问这个数字有多少种排列可能,最简单的就是位数的阶乘,5位数字等于5*4*3*2*1=120,这是理论上没有重复数字的情况下,如果现在是11234,11123,11112,11223有重复数字组成的数字怎么计算呢? 若一个数字由所有不相同的数字组成,则该数字的排列可能是该数组位数的阶乘,若该数字中存在重复的数字,例如,有m个1相同,结果就是n! / m!,n值是数... 阅读全文

跟我做WinForm开发(2)-后台逻辑操作

2012-01-08 12:32 by 空逸云, 4893 阅读, 收藏, 编辑
摘要:上一篇中,我简单了介绍了实现自定义UI的步骤和其中一些需要注意的点;详见:跟我做WinForm开发(1)-自定义UI,下面,我就继续完成上篇没完成的逻辑操作; 获取声音 这是一个发音器,声音的来源是Google,打开Google翻译,输入一段英文,并点击发音,Google很快就读取了我所输入的句子,打开HttpWatch,发现,实际上每次发音,都会把输入的句子做一次UrlEncode,然后发往... 阅读全文

跟我做WinForm开发(1)-自定义UI

2012-01-07 12:03 by 空逸云, 9972 阅读, 收藏, 编辑
摘要:前言 前阵子,学英文的时候听发音,意外之中发现Google的发音相比大部分TTS发音更准确,而且读句子也没有普通TTS那种一听就是机器人的声音,心血来潮,想利用Google发音做一个小软件,所以就有了本文。 这是最后的UI成品图,可以看到,没有了常见的按钮,也没有了常见的Title框,整个布局随心所欲,GDI+?No。下面,就带大家跟我一起来用最简单的方式开发你所期望的UI吧! 自定义窗... 阅读全文

细说文件读写操作(读写锁)

2011-11-15 00:20 by 空逸云, 6688 阅读, 收藏, 编辑
摘要:开发过程中,我们玩玩需要大量与文件交互,读文件,写文件已成家常便饭,本地运行完美,但一上到投产环境,往往会出现很多令人措手不及的意外,或开发中的烦恼,因此,我对普通的C#文件操作做了一次总结,问题大部分如下: 1:写入一些内容到某个文件中,在另一个进程/线程/后续操作中要读取文件内容的时候报异常,提示System.IO.IOException: 文件“XXX”正由另一进程使用,因此该进程无法访... 阅读全文

您真的了解类型转换吗?请止步,解惑!

2011-08-29 00:11 by 空逸云, 2290 阅读, 收藏, 编辑
摘要:不久前,因为对类型转换CLR的底层实现很朦胧,万不得已下,发了一篇博文请园里的各位同学,大大解惑。 您真的了解类型转换吗?请止步,求解! 很多热心的园友纷纷发表了自己的意见和见解,在各位童鞋的帮助下,逐渐理清了类型转换的内幕(也可能并不是很正确!),于是想再整理一次,欢迎大家指正,而且也延发了其他的问题,想与大家一起讨论。 类型转换的疑惑 在上个问题中,我声明了两个类,父类Person,子... 阅读全文

您真的了解类型转换吗?请止步,求解!

2011-08-24 23:57 by 空逸云, 4423 阅读, 收藏, 编辑
摘要:前阵子,一名同事问及类型转换的问题,我也仅仅说出目前自己的了解。但回头想想,其中的确大有学问,以前只看到了表面,其内在的表现如何,苦苦翻书,Google几番之后,依然无所收获,故大胆写下,求园中各位大牛不吝解答。 类型转换的疑惑 首先,我们知道类型转换也就那点事(表面的说),总归而言,C#下有几种转换,装箱,拆箱,向上类型转换,向下类型转换,平行类型转换几种。这几种的区别目前也不细说了,感兴趣... 阅读全文

基于AppDomain的"插件式"开发

2011-08-01 09:58 by 空逸云, 10485 阅读, 收藏, 编辑
摘要:很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统,这个WinService系统管理的形形色色各种各样的服务,这些服务也是各个"插件式"的类库,例如: 我们提供了一个IJob接口,所有"服务"都继承该接口,然后做相关的配置,在服务启动时,就可以根据配... 阅读全文

青梅煮酒论C#:Specification pattern

2011-01-16 13:56 by 空逸云, 3016 阅读, 收藏, 编辑
摘要:Specification模式早在3个多月前,阅读一个开源博客的时候便接触到了.但并没多少深入.最近,抽空将其好好研究了一番,果然,其魅力的确能让你回味无穷,那现在,就让我们零距离接触Specification模式吧! 何为Specification? Specification,中文有翻译规格,虽然有很多争论,但目前叫得最多的,还是规格模式,既然说到了规格,那其作用估计就能不言而喻了. Sp... 阅读全文

你正确的使用Out/Ref了吗?

2010-12-03 19:19 by 空逸云, 601 阅读, 收藏, 编辑
摘要:最近在努力的学习MVC.并逐步的把Asp.net MVC应用到实际项目中去.先前.找了不少开源项目,心里一个高兴啊.一边摸索一边借鉴(抄)着别人的代码,并希望能从中吸收大牛们的思想.在CodePlex找到一个不错的开源项目.借鉴着就着手开发了.一路上风平浪静.抄代码抄得起劲.不料出现了一个让我措手不及的错误.该代码实现如下. 该方法就是获取配置文件里相关的AppSetting项,并将其转换成In... 阅读全文

【More Effective C#】Partial Class是怎样炼成的?

2010-10-28 08:14 by 空逸云, 2717 阅读, 收藏, 编辑
摘要:什么是部分类(Partial Class)? C#中.我们可以利用部分类,将一个类分散到多个类文件中,这样我们就可以多个开发者同时开发某个类库,或者是扩展其他开发者发布的类库.甚至是代码生成器生成的代码,例如LINQ2SQL,ADO.NET EF等,以获取更高效的开发. Re:Class和Class File的区别.这里的类是我们平时所说的普通类-Class,如抽象类,基类,子类等等.而类文件-... 阅读全文

【More Effective C#】掩藏在Nullable<T>后的秘密

2010-10-27 08:19 by 空逸云, 2015 阅读, 收藏, 编辑
摘要:对于可空类型,我们并不陌生.例如,当我们为我们的数据库生成一个实体时,例如LINQ2SQL,查看实体类中的字段,经常会发现.我们那些定义为可空的字段的类型后面都会多了个?,如int?string?char?,bool?等等.这就是今天的主角---可空类型. Nullable<T> 事实上,所有的可空类型都继承自Nullable<T>类,而编译器为了方便大众,提供了几个常用... 阅读全文

【More Effective C#】IEnumerable和IQueryable的那点事

2010-10-22 08:08 by 空逸云, 2760 阅读, 收藏, 编辑
摘要:IEnumerable,IQueryable之前世今生             IEnumerable<T>在.Net2.0中我们已经很熟悉了.你想要利用Foreach迭代吗?实现IEnumerable<T>吧!你想直接做为数据源绑定到控件吗?使用IEnumera... 阅读全文

【More Effective C#】区分早期执行和晚期执行

2010-10-20 08:19 by 空逸云, 2031 阅读, 收藏, 编辑
摘要:             Lambda的出现.使我们除了可以使用"古老"的命令式代码(imperative code),还可以使用声明式代码(declarative code),可以让我们作出更为灵活的实现与工程实践. 命令式代码 顾名思义,命令式代码如同... 阅读全文

【More Effective C#】Lambda表达式优化

2010-10-19 08:09 by 空逸云, 4418 阅读, 收藏, 编辑
摘要:使用Lambda表达式将会造成Lambda表达式主题部分的代码重复. 若每当我们要获取一次不同工薪阶层的数据.就要重复一次.相信久经"高重用,松耦合"定律的你.肯定会想尽办法将其实现高重用,松耦合.在以前方法调用的时代.可能你会将其提炼出这样,每次我们调用的时候,将大大减少代码量,提高可复用性.然而,很不幸的是.在这里.这种重构的方式反倒降低了其可重用性.实际上,第一种方法的可... 阅读全文

【More Effective C#】LINQ表达式与方法调用的映射

2010-10-15 08:05 by 空逸云, 843 阅读, 收藏, 编辑
摘要:LINQ构建在两个概念之上,一种查询语言和一系列将查询语言转换成方法调用的实现.在编译时,编译器将LINQ表达式(LINQtoobject)转换成方法调用..Net基础类库提供了两种扩展方法.System.Linq.Enumerable使用了IEnumerable<T>上扩展来实现,而System.Linq.Queryable则提供了类似的一系列IQueryable<T>上... 阅读全文

【More Effective C#】延迟求值

2010-10-14 18:30 by 空逸云, 808 阅读, 收藏, 编辑
摘要:LinQ查询时,我们不会立即得到返回的数据并生成一个序列.定义该查询只是为了得到查询结果所要的执行的步骤,只有开始迭代查询时,查询才会真正的执行.这样,每次执行查询,都会从头开始执行查询的每个步骤,每次遍历/迭代都会得到全新的结果.这就叫延迟求值.相反.很多时候我们要所见即所得.定义什么查询都得到唯一的数据列表.这叫主动求值.理解延迟查询.举个不太恰当的例子.如C#的Const.我们定义了一个常量... 阅读全文

【More Effective C#】仅声明非虚的事件

2010-10-13 08:17 by 空逸云, 365 阅读, 收藏, 编辑
摘要:C#除了可以声明虚方法,属性外,也可以声明虚事件.但是并不建议使用虚事件.因为这常会带来不可预测的Bug.我们定义了一个WorkerEngine类.它有一个虚事件. [代码]C#3.0中.编译器将会自动创建私有字段,以及公共add和remove方法.[代码] 由于该私有字段是编译器生成的.所以你无法通过代码访问.而且,派生事件将隐藏基类中的事件,派生类所作的工作与原始版本完全一致.即基类有一个自己... 阅读全文

【More Effective C#】扩展方法

2010-10-12 08:17 by 空逸云, 533 阅读, 收藏, 编辑
摘要:C#3.0中增加了许多新特性.其中.扩展方法允许我们在不修改原有代码的基础上扩展类/接口的功能.有技巧的运用该特性.能写出有效率/易维护/美观的代码.增强现有接口  C#2.0提供了许多泛型与容器的接口和类.最常见的如IComparable<T>常常需要新建一个Comparable来进行排序比较等等..但其默认只有一个CompareTo方法.在以前.我们只能手动添加.并且很难复用代码.... 阅读全文