木子屋 Dnawo's BLOG

2009-04 归档

共 63 篇

Effective C# 原则4:用条件属性而不是#if预编译块

使用#if/#endif 块可以在同样源码上生成不同的编译(结果),大多数debug和release两个版本。但它们决不是我们喜欢用的工具。由于#if/#endif很容易被滥用,使得编写的代码难于理解且更难于调试。程序语言设计者有责任提供更好的工具,用于生成在不同运行环境下的机器代码。C#就提供了条件属性(Conditional attribute)来识别哪些方法可以根据环境设置来判断是否应该被调用。 (译注:属性在C#里有两个单词,一个是property另一个是attribute,它们有不是的意思,但译为中文时一般都是译为了属性。property是指一个对象的性质,也就是Item1里说的属性。而这里的attribute指的是.net为特殊的类,方法或者property附加的属性。可以在MSDN里查找attribute取得更多的帮助,总之要注意:attribute与property的意思是完全不一样的。) 这个方法比条件编译#if/#endif更加清晰明白。编译器可以识别Conditional属性,所以当条件属性被应用时,编译器可以很出色的完成工作。条件属性是在方法上使用的,所以这就使用你必须把不同条件下使用的代码要写到不同的方法里去。当你要为不同的条件生成不同的代码时,请使用条件属性而不是#if/#endif块。…

Effective C# 原则3:选择is或者as操作符而不是做强制类型转换

C#是一个强数据类型语言。好的编程实践意味着当可以避免从一种数据类型强制转化为另种数据类型时,我们应该尽我们的所能来避免它。但在某些时候,运行时类型检测是不可避免的。在C#里,大多数时候你要为调用函数的参数使用System.Object类型,因为Framwork已经为我们定义了函数的原型。你很可能要试图把那些类型进行向下转化为其它类型的接口或者类。你有两个选择:用as运算符,或者,采用旧式的C风格,强制转换。(不管是哪一种,)你还必须对变量进行保护:你可以试着用is进行转换,然而再用as进行转换或者强制转换。 无论何时,正确的选择是用as运算符进行类型转换。因为比起盲目的强制转换它更安全,而且在运行时效率更高。用as和is运算符进行转换时,并不是对所有的用户定义的类型都能完成的。它们只在运行时类型和目标类型匹配的时候,转换才能成功。它们决不会构造一个新的对象来满足(转化)要求。 看一个例子。你写了一段代码,要转换一个任意类型的对象实例到一个MyType类型的实例。你是这样写代码的:…

Effective C# 原则2:为你的常量选择readonly而不是const

对于常量,C#里有两个不同的版本:运行时常量和编译时常量。 因为他们有不同的表现行为,所以当你使用不当时,将会损伤程序性能或者出现错误。 两害相权取其轻,当我们不得不选择一个的时候,我们宁可选择一个运行慢一点但正确的那一个,而不是运行快一点但有错误的那个。基于这个理由,你应该选择运行时常量而不是编译时常量(译注:这里隐藏的说明了编译时常量效率更高,但可能会有错误)。 编译时常量更快更直接,但在可维护性上远不及运行时常量。保留编译时常量是为了满足那些对性能要求克刻,且随着程序运行时间的过去,其值永远不发生改变的常量使用的(译注:这说明编译时常量是可以不被C#采用的,但考虑到性能问题,还是做了保留)。…

Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)

出于以下几点原因,请在设计类时,尽可能的使用属性,而不是成员。 1、.Net对属性的支持远远大于对成员的支持,你可以对属性进行数据绑定,设计时说明等很多数据成员不被支持的内容。看看.net里的属性面板,你会明白的。 2、数据安全性检测; 属性本质上是两个函数,只是因为C#的特殊语法,但我们可以像访问成员一样的访问它。因此我们可以在属性设计上添加更多更灵活的内容,对属性进行管理。其中对属性数据的检测是其中之一。 在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决,千万不要设置默认值,这是很危险的事情。例如: 看上去很不错不是吗?请马上动手修改你的代码吧,上面的代码是很危险的!或者你还不明白,明明对数据进行了安全检测,为什么还是危险的呢?试想这样的情况,有两个实例o1与o2, o1的Name为null,我们做了这样的事:o2.Name = o1.Name;…

使用Sandcastle生成C#类库文档

1.准备工作 ·下载并安装Sandcastle,点击下载 ·生成类库的dll文件及xml文档 2.生成类库文档(chm格式) 依次打开C:\Program Files\Sandcastle\Examples\generic,双击运行SandcastleGui.exe,设置dll及xml文档路径,点击Build按钮(会弹出一个保存项目对话框,选个路径保存)开始生成: 等提示"Build is finished"即生成完成,在C:\Program Files\Sandcastle\Examples\ThemeMakerLib\vs2005\chm中可找到ThemeMakerLib.chm。 说明 .打开项目属性,切换到"生成"选项卡,钩选"输出→XML 文档文件",生成类库时即可生成xml文档文件。

慎用Request.Params获取参数值

今天一通道技术反映我们提交过去的url太长了,形如: http://service.5k3g.com/r.aspx?i=8986272,/ay/bajie10669611.ashx 在日志中找了相应的记录,日志如下: http://219.140.177.243/ay/bajie10669611.ashx?pid=5&phone=13182000000&name=%e5%a8%83%e5%a8%83&url=http%3a%2f%2fservice.5k3g.com%2fr.aspx%3fi%3d8986272 并没有多提交内容,最后发现原因是对方使用HttpContext.Current.Request.Params获取参数值。我们先来看一个例子:…

年轻人少奋斗8年的10个方法

1.努力 工作要努力,随随便便过日子过四五年也是过,稍微努力的过四五年也是过,努力的过四五年也是过,何不努力好好的干。如果努力的过好毕业后的四五年,这对我们以后的人生非常有帮助。 2.虚心学习 多与比自己大的人(长辈)/成功人士交流学习,要虚心听取/认真分析他们的意见和建议,以免自己以后走弯路。 3.自由 出来外面做事情,关键是自由,愉快,能学到知识。每走一步都要分析,不要因某一小点利益限制了自己的自由。记住,30岁之前,不要太在意自己的存款和职位,这些对以后来说太微不足道了。 4.目标 人生一定要有目标,不仅仅是事业(赚钱)的目标,其他方面也要有目标,如爱情方面的目标,健康方面的目标,家庭方面的目标。各个目标都要重视。只赚了钱,不算成功的人生,也迟早会应了“短木桶效应”。…

这几天访问百度有点异常

这几天访问百度时在地址栏或状态栏总能看到类似的地址: http://120.57.254.3/popup/receiveurl.php?url=http://www.baidu.com/ 开始还以为浏览器被安装什么插件了,360清除了没效果,今天晚上更是奇怪,在百度首页搜索却跳转到google了,碰巧机子要重装,奇怪的重装后问题依旧。难道百度域名被劫持了? 每次跳转都非常快,不仔细看不会察觉,我还是抓了张图: