爱上C#的理由 之 implicit隐式转换

写机器能够读懂的代码简单,写人类能够读懂的代码才是真功夫,而C#则提供了诸多优秀的语言特性来帮助你写出更加整洁、易读的代码。今天介绍的是implicit隐式转换

作为例子,我们定义了一个HsbColor结构(struct),它与Color类似,是对于色彩的一种数学表示,只是其色彩空间为HSB,而非Color采用的RGB色彩空间,因此你可以通过HsbColor.s来设置色彩的饱和度。下面这个函数可以调整当前物体材质颜色的饱和度:

可以看出,在创建hsbColor实例的时候,我们在构造函数中传入一个Color类型参数,最后在调整完hsbColor的饱和度后,又通过ToColor()函数将其转换为Color,并给material.color赋值。这段代码并无甚不妥,只是在implicit隐式转换的帮助下,我们可以让它变得更为简洁:

从上面的代码可以看到,我们可以使用Color直接为HsbColor赋值,同样的,我们还可以直接将HsbColor赋值给Color类型参数——这就是数据类型的隐式转换,在HsbColor中我定义了这样两个静态函数:

它们实现了HsbColor到Color之间的隐式转换。

需要注意的一点是,采用implicit隐式转换的一个首要原则是数据转换过程中没有丢失信息(如精度),HSB和RGB属于同一色彩的不同色彩空间表示,满足这一条件。而如果是float至int这类丢失数据精度的转换,我们则应该采用explicit显示转换:A = (A) B,这样可以在编译过程中就提示程序员转换非完全等价。

implicit和explicit属于C#的一个很小的语言特性,介绍的文章也很多在此不再赘述,附上实例中用到的HsbColor脚本,除了提供通过HSB属性定义颜色的功能外,还提供了HsbColor.Lerp函数,使你可以在HSB色彩空间内进行颜色转换,比起RGB空间的Color.Lerp更加符合人眼色彩变化的观感:

爱上C#的理由 之 implicit隐式转换》上有1条评论

  1. Pingback引用通告: 爱上C#的理由 之 implicit隐式转换 - Unity3D - 开发者问答

发表评论

电子邮件地址不会被公开。 必填项已用*标注