摘要: 我们最好尽可能的编写最清晰的代码,将优化交给JIT编译器完成。一个常见的错误优化是,将大量逻辑放在一个函数中,以期减少额外的方法调用开销。这种将函数逻辑直接写在循环内部的常见优化做法却会降低.NET应用程序的性能。 在第一次调用BuildMsg时,if else的两个分支都会被JIT编译。而实际上仅 阅读全文
posted @ 2017-04-26 10:32 爱幻想の宅 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 转换操作符为类之间引入了一种“可替换性”(substitutability)。“可替换性”表示一个类的实例可以替换为另一个类的实例。 在某个类型定义了转换操作符之后,实际上是告诉编译器这些类型可以当做目标类型使用。不过,这样的替换经常会导致一些难以理解的BUG,因为这个类型不能完美的当做目标类型的替 阅读全文
posted @ 2017-04-26 10:30 爱幻想の宅 阅读(213) 评论(0) 推荐(0) 编辑
摘要: C 现在支持调用者一方使用具名参数(named parameter)。类型中的名称也成为了公有接口的一部分。修改公有参数名称将有可能破坏掉调用者的代码。 这时,如果修改参数名称,虽然程序仍可正常执行,但调用者进行编译时将会出错。 此外,为现有方法添加(设置带默认值的)参数将会在运行时抛出异常。需要调 阅读全文
posted @ 2017-04-26 10:30 爱幻想の宅 阅读(293) 评论(0) 推荐(0) 编辑
摘要: C 语言中并不缺少控制程序流程的结构, 等都可以做到这一点。但我们还有更好的方式: 下面这段代码演示了用命令式的方式填充一个数组,然后将其内容输出到控制台: 这只是个简单的操作,因此你可能看不到太多的好处。确实如此,不过你可以继续看看其他一些问题。 很多操作要处理嵌套循环。例如,用0~99的整数生成 阅读全文
posted @ 2017-04-26 10:29 爱幻想の宅 阅读(328) 评论(0) 推荐(0) 编辑
摘要: GetHashCode()函数仅会在一个地方用到,即为基于 的集合定义的散列键时,此类集合包括HashSet和Dictionary容器等。 但object基类提供的GetHashCode()实现有很多问题。 + 对于引用类型,虽然可以正常工作,但效率很低 + 对于值类型,基类中的实现有时甚至是不正确 阅读全文
posted @ 2017-04-26 10:28 爱幻想の宅 阅读(1945) 评论(0) 推荐(0) 编辑
摘要: System.Object.ToString()是.NET环境中最常用的方法之一。编写类型时,要提供一个合理的ToString版本,否则使用者就不得不自己构造一套可以阅读的表示。 虽然简单的ToString()方法很多时候已经可以满足为用户定义的类型显示文本信息的需求,但有时还会需要功能更强的方法。 阅读全文
posted @ 2017-04-26 10:27 爱幻想の宅 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 当创建自定义类型时(无论是class还是struct),应为类型定义"等同性"的含义。C 提供了4种不同的函数来判断两个对象是否"相等": 和`Object.Equals()`这两个系统提供的静态方法,永远都不需要重新定义。 判断的是对象引用,判断的是否拥有同样的对象标识(object identi 阅读全文
posted @ 2017-04-26 10:27 爱幻想の宅 阅读(279) 评论(0) 推荐(0) 编辑
摘要: ` if/ endif`语句常用来基于同一份源代码生成不同的编译结果,其中最常见的就是debug版和release版。但是这在实际应用中并不是非常友好,因为它们容易被滥用,其代码也难以理解或调试。 C 为此添加了一个 特性,该特性可以标识出某种环境设置下某个方法是否应该被调用。使用这种方式来描述条件 阅读全文
posted @ 2017-04-26 10:26 爱幻想の宅 阅读(435) 评论(0) 推荐(0) 编辑
摘要: 在日常编码中,很多时候都要编写接受object作为参数的方法,接下来是将这些object转型成特定类型,要么类,要么接口。这时我们有两种选择,使用as操作符,或者使用强制类型转换。 正确的做法是,尽可能使用as操作符,因为相对强制转换来说,as更加安全,也更加高效。 例: 强制转换: 显然第一种方法 阅读全文
posted @ 2017-04-26 10:24 爱幻想の宅 阅读(214) 评论(0) 推荐(0) 编辑
摘要: C 有两种类型的常量: 和`运行时常量 运行时常量`。 运行时常量使用 关键字声明,编译期常量则使用 关键字声明: 二者最重要的区别在于, 值是运行时解析的,而 是在生成IL码就已经确定。 声明的常量必须不能改变,若改变了,则需要重新编译所有引用的程序集。 阅读全文
posted @ 2017-04-26 10:22 爱幻想の宅 阅读(461) 评论(0) 推荐(0) 编辑
摘要: 在需求变更中,属性比数据成员更容易修改,例:客户对象不该与空白名称,若你使用公有属性封装Name,那么现在修改一处,而数据成员则可能要修改多处 因为属性是使用方法实现的,所以添加多线程支持也非常简单 属性还可以拥有方法所有语言特性。例如:属性可以为虚的(virtual): 还可以将属性声明为抽象的( 阅读全文
posted @ 2017-04-26 10:18 爱幻想の宅 阅读(207) 评论(0) 推荐(0) 编辑