[1]. 即使用属性的代码。——译者注
[2]. 即声明的同时初始化。——译者注
[3]. 译者认为这里的“运行时版本”应为“运行时常量”。——译者注
[4]. 有关转换操作符,参见条款28。——译者注
[5]. 前提是st的实际类型,即运行时类型要一致。——译者注
[6]. 应该为InvalidCastException。——译者注
[7]. .isinst是as和is操作符编译为IL代码后,执行类型比较的关键指令。——译者注
[8]. 这里的不变式是指为了确保类或者对象的本质不会被破坏,而采用一套对其自身状态进行校验的条件。——译者注
[9].这种说法不够准确,Java中预定义的一些数值类型和字符类型仍然为值类型,只是用户自定义的类型只能为引用类型。——译者注
[10].严格来讲这种方式是在“以传值的方式”来传递引用类型,和传引用还有所区别。——译者注
[11].同样,这里准确的说法应该是自定义类型的变量,因为Java中预定义的值类型变量不会分配在堆上,也没有垃圾收集负担;下同。——译者注
[12].严格来讲,除了两倍大小的MyType外,引用类型C的实例对象还需要8个字节的存储空间用于存储方法标指针和SyncBlockIndex;下同。——译者注
[13]. 这里的类型指电话的类型,比如家庭电话或办公电话等。——译者注
[14].二进制意义上的0,即如果为引用类型,就是地址为0。——译者注
[15].因为无论我们是否提供构造器,每一个值类型都必然有一个默认的构造器,该默认构造器会将其内所有成员初始化为0。——译者注
[16]. 这里似为作者笔误,对于operator==应该是重载而非重写,即overload而非override;下同。——译者注
[17]. 这里似为笔误,应为ValueType。——译者注
[18]. 这里为作者笔误,应该为base.Equals方法。——译者注
[19].这里的说法并不准确,值类型默认情况下并没有定义operator==()操作符,因此应该说“考虑定义”而非“重定义”;下同。——译者注
[20].这里似为作者笔误,静态方法只可能隐藏,不可能重写,因此准确的说法应该是“自己提供”而非“重写”。
——译者注
[21].这里并非重载而是重写,即override而非overload,GetHashCode()是一个虚方法。——译者注
[22].这里的说法不够准确,这里“对象相等”的含义应该由Object.Equals虚方法定义,而非operator==定义;下同。——译者注
[23].即引用相等。——译者注
[24].所有本章中谈到的ValueType类型的operator==都是不准确的,应该为ValueType.Equals方法。因为ValueType默认并没有提供operator==。——译者注
[25].这里的说法并不正确,实现IEnumerator接口并不能使一个类成为一个集合类。另外IEnumerable接口中包含的就是GetEnumerator方法,但我们也可以不实现IEnumerable接口,而只提供一个GetEnumerator方法来支持foreach语句。因此作者在这里将提供GetEnumerator方法与实现IEnumerable接口作为两种不同的方式来归纳。——译者注
[26].这里的using语句会转化成一段包含try/finally的资源管理代码,具体可以参见本书条款15。——译者注