Effective C# 原则11:选择foreach循环

JerryXia 发表于 , 阅读 (1,923)
C#的foreach语句是从do,while,或者for循环语句变化而来的,它相对要好一些,它可以为你的任何集合产生最好的迭代代码。它的定义依懒于.Net框架里的集合接口,并且编译器会为实际的集合生成最好的代码。当你在集合上做迭代时,可用使用foreach来取代其它的循环结构。检查下面的三个循环:int [] foo = new int[100]; // Loop 1: foreach ( int i in foo) Console.WriteLine( i.ToString( ... 阅读全文

C#性能优化实践

JerryXia 发表于 , 阅读 (1,740)
性能主要指两个方面:内存消耗和执行速度。性能优化简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。本文以.NET平台下的控件产品MultiRow为例,描述C#性能优化的实践。性能优化原则· 理解需求MultiRow的一个性能需求是:“百万行数据绑定下平滑滚动。”整个MultiRow项目的开发过程一直在考虑这个目标。· 理解瓶颈99%的性能消耗是由于1%的代码造成的。大部分性能优化都是针对这1%的瓶颈代码进行的。具体实施也就分为两步:“发现瓶颈”和“消... 阅读全文

Effective C# 原则10: 明白GetHashCode()的缺陷

JerryXia 发表于 , 阅读 (2,137)
这是本书中唯一一个被一整个函数占用的原则,你应该避免写这样的函数。GetHashCode()仅在一种情况下使用:那就是对象被用于基于散列的集合的关键词,如经典的HashTable或者Dictionary容器。这很不错,由于在基类上实现的GetHashCode()存在大量的问题。对于引用类型,它可以工作,但高效不高;对于值类型,基类的实现经常出错。这更糟糕。你自己完全可以写一个即高效又正确的GetHashCode()。没有那个单一的函数比GetHashCode()讨论的更多,且令人困惑。往下... 阅读全文

Effective C# 原则9:明白几个相等运算之间的关系

JerryXia 发表于 , 阅读 (1,851)
明白ReferenceEquals(), static Equals(), instance Equals(),和运算行符==之间的关系。当你创建你自己的类型时(不管是类还是结构),你要定义类型在什么情况下是相等的。C#提供了4个不同的方法来断定两个对象是否是相等的:public static bool ReferenceEquals( object left, object right ); public static bool Equals( object left, object r... 阅读全文

Effective C# 原则8:确保0对于值类型数据是有效的

JerryXia 发表于 , 阅读 (1,892)
.Net系统默认所有的对象初始化时都为0。这并没有提供一个方法来预防其他程序员创建的值类型数据的实例在初始化是都是0。请让你的数据类型默认值也是0。一个特殊情况是在枚举类型数据中。决不要创建一个不包括0在内的枚举类型。所有的枚举类型都是从System.ValueType派生的。枚举类型的值是从0开始的,但你可以改变这一行为:public enum Planet { // Explicitly assign values. // Default starts at 0 oth... 阅读全文

Effective C# 原则7: 选择恒定的原子值类型数据

JerryXia 发表于 , 阅读 (4,299)
恒定类型(immutabletypes)其实很简单,就是一但它们被创建,它们(的值)就是固定的。如果你验证一些准备用于创建一个对象的参数,你知道它在验证状态从前面的观点上看。你不能修改一个对象的内部状态使之成为无效的。在一个对象被创建后,你必须自己小心翼翼的保护对象,否则你不得不做错误验证来禁止改变任何状态。恒定类型天生就具有线程完全性的特点:多访问者可同时访问相同的内容。如果内部状态不能修改,那么就不能给不同的线程提供查看不一致的数据视图的机会。恒定类型可以从你的类上安全的暴露出来。调用... 阅读全文

Effective C# 原则6:区别值类型数据和引用类型数据

JerryXia 发表于 , 阅读 (1,646)
值类型数据还是引用类型数据?结构还是类?什么你须要使用它们呢?这不是C++,你可以把所有类型都定义为值类型,并为它们做一个引用。这也不是Java,所有的类型都是值类型。你在创建每个类型实例时,你必须决定它们以什么样的形式存在。这是一个为了取得正确结果,必须在一开始就要面对的重要决定。(一但做也决定)你就必须一直面对这个决定给你带来的后果,因为想在后面再对它进行改动,你就不得不在很多细小的地方强行添加很多代码。当你设计一个类型时,选择struct或者class是件简单的小事情,但是,一但你的... 阅读全文