本文转自Unity Connect博主 郡墙
在Unity中的 Effectie C# 思想分享
尽可能使用属性(property),而不是直接访问数据成员
- 属性允许将数据成员作为共有接口的一部分暴露出去,同时仍旧提供面向对象环境下所需的封装。属性这个语言元素可以让你像访问数据成员一样使用,但其底层依旧是使用方法实现的
- 可以非常轻松的在get和set代码段中加入检查机制
- 因为属性是用方法实现的,所以它拥有方法所拥有的一切语言特性
- 属性增加多线程的支持是非常方便的。你可以加强 get 和 set 访问器(accessors)的实现来提供数据访问的同步
- 属性可以被定义为virtual。
- 可以把属性扩展为abstract。
- 可以使用泛型版本的属性类型。
- 属性也可以定义为接口。
- 因为实现实现访问的方法get与set是独立的两个方法,在C# 2.0之后,你可以给它们定义不同的访问权限,来更好的控制类成员的可见性
- 而为了和多维数组保持一致,我们可以创建多维索引器,在不同的维度上使用相同或不同类型。
- 需要在类型的公有或保护接口中暴露数据
偏向于使用运行时常量(readonly),而不是编译时常量(const)
const
- 应仅仅在那些性能异常敏感,且常量的值在各个版本之间绝对不会变化时,再使用编译时常量。
- 编译时常量(const)的值会被目标代码中的值直接取代
- 仅能用于数值和字符串
readonly
- 在运行时进行求值。引用运行时生成的IL将引用到readonly变量,而不是变量的值。
- 可以为任意类型。运行时常量必须在构造函数或初始化器中初始化,因为在构造函数执行后不能再被修改
- 可以用readonly值保存实例常量,为类的每个实例存放不同的值。而编译时常量就是静态的常量。
- 有时候你需要让某个值在编译时才确定,就最好是使用运行时常量
- 标记版本号的值就应该使用运行时常量,因为它的值会随着每个不同版本的发布而改变。
- const优于readonly的地方仅仅是性能,使用已知的常量值要比访问readonly值略高一点,不过这其中的效率提升,可以说是微乎其微的。
结论
综上,在编译器必须得到确定数值时,一定要使用const。例如特性(attribute)的参数和枚举的定义,还有那些在各个版本发布之间不会变化的值。除此之外的所有情况,都应尽量选择更加灵活的readonly常量。
推荐使用 is 或 as 操作符而不是强制类型转换
as和is操作符都不会执行任何用户自定义的转换,它们仅当运行时类型符合目标类型时才能转换成功,也不会在转换时创建新的对象
is
- 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常
- as运算符对值类