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

.Net系统默认所有的对象初始化时都为0。这并没有提供一个方法来预防其他 程序员创建的值类型数据的实例在初始化是都是0。请让你的数据类型默认值也 是0。

一个特殊情况是在枚举类型数据中。决不要创建一个不包括0在内 的枚举类型。所有的枚举类型都是从System.ValueType派生的。枚举类型的值是 从0开始的,但你可以改变这一行为:

public enum Planet
{
 // Explicitly assign values.
 // Default starts at 0 otherwise.
 Mercury = 1,
 Venus = 2,
 Earth = 3,
 Mars = 4,
 Jupiter = 5,
 Saturn = 6,
 Neptune = 7,
 Uranus = 8,
 Pluto = 9
}
Planet sphere = new Planet();

sphere此时的值就是0,而这并不是一个有效的值。枚 举类型的取值限制在所有列举的值中,任何依懒这一(普通)事实的代码都将无法 工作。当你为你的枚举类型创建你自己的取值时,请确保0是当中的一个。如果 你的枚举类型采用的是以位(bit)模式,把0定义为其它属性不存在时的取值。

按照现在的情况,你迫使用户必须精确的初始化值:

Planet sphere = Planet.Mars;

这将使包含 (Planet)这一类型的其它类型很难创建:

public struct ObservationData
{
 Planet  _whichPlanet; //what am I looking at?
 Double _magnitude; // perceived brightness.
}

创建一个新ObservationData实例的用户会创建一个不合法的 Planet成员:

ObservationData d = new ObservationData ();

时间: 2024-10-22 13:16:33

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

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

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

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

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

使用JDBC4.0操作XML类型数据

在JDBC4.0推出后,它的从多的特性正在受到广泛地关注.而最重要的更新就是支持XML数据类型(在最新的SQL2003标准中定义了这种数据类型),当然,将XML数据保存在数据库中,并在应用程序中更新XML数据并不是什么新技术.但这是JDBC第一次提供了一个映射接口(java.sql.SQLXML),并利用这个接口来支持SQL/XML数据类型.当然,为了满足处理XML数据类型的需要,其他的接口,如java.sql.Connection和java.sql.ResultSet,也被更新了. 在SQL2

Effective C#原则49:为C#2.0做好准备

C#2.0,在2005年已经可以使用了,它有一些主要的新功能.这样使得目前使 用的一些最好的实际经验可能会有所改变,这也会随着下一代工具的发布而修改 .尽管目前你还可以不使用这些功能,但你应该这些做些准备. 当 Visual Studio .net2005发布后,会得到一个新的开发环境,升级的C#语言.附 加到这门语言上的内容确实让你成为更有工作效率的开发者:你将可以写更好重 用的代码,以及用几行就可以写出更高级的结构.总而言之,你可以更快的完成 你的工作. C#2.0有四个大的新功能:范型,迭

Effective C#原则12:选择变量初始化而不是赋值语句

(译注:根据我个人对文章的理解,我把initializer译为:初始化器,它是 指初始化语法,也就是在一个类里声明变量的同时,直接创建实例值的方法. 例:object m_o = new object();如果这段代码不在任何函数内,但在 一个类里,它就是一个初始化器,而不管你是把它放在类的开始还以结尾.) 一些类经常不只一个构造函数.时间一长,就难得让它的成员变量以及 构造函数进行同步了.最好的确保这样的事不会发生的方法就是:在声明就是的 时间就直接初始化,而不是在每个构造函数内进行赋值.而且

Effective C#原则17:装箱和拆箱的最小化

值类型是数据的容器,它们不具备多太性.另一方面就是说,.Net框架被设 计成单一继承的引用类型,System.Object,在整个继承关系中做为根对象存在 .设计这两种类型的目的是截然不同的,.Net框架使用了装箱与拆箱来链接两种 不同类型的数据.装箱是把一个值类型数据放置在一个无类型的引用对象上,从 而使一个值类型在须要时可以当成引用类型来使用.拆箱则是额外的从" 箱"上拷贝一份值类型数据.装箱和拆箱可以让你在须要使用 System.Object对象的地方使用值类型数据.但装箱与拆箱

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

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

《Effective C#》:值类型和引用类型

在C#中有两种类型的数据,一种是值类型数据,一种是引用类型数据.在编 码的时候区分这两种类型数据,可以避免一些细小的编码错误. 首先说 说什么类型是值类型,例如:int.float.bool之类的基础类型,以及用struct 定义的类型,如:DateTime.除此外,如string,数组,以及用class定义的类 型等都是引用类型.对于C#来说,很难罗列出所有类型进行一一分别,这需要自己在编码过程中进行分析总结. 为了更好地说明两种类型之间的区别, 借用如下的表格来说明.   值类型 引 用类型

[CLR via C#]5.3 值类型的装箱和拆箱

原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆上的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量. 2)值类型的字段复制到新的分配的堆内存. 3)返回对象的地址.现在,这个地址是对一个对象的引用,值类型现在是一个引用类型. 拆箱不是直接将装箱过程倒过来.拆箱