Unity3D-C#扩展方法
2015-12-19 12:16
429 查看
什么是扩展方法?
扩展方法从字面上理解是指扩展的方法,而对应到面向对象编程这个格局中则是指为一个类提供的扩展方法。按照我们通常的理解,我们首先需要获得某个类的源代码,然后在这个类代码中增加成员方法,这样就可以达到为一个类提供扩展方法的目的。可是不幸地是,这种方法在没有源代码的情况下就无法奏效了,而且我们人为地去改变源代码有可能会破坏整个代码的稳定性。那么有没有一种方法能在不改变源代码的前提下为某个类提供扩展方法呢?这就是我们今天要说的扩展方法,所以我们可以将扩展方法理解为在不改变源代码的前提下向外部提供扩展方法的一种方式。C#中的扩展方法实现起来是相对来说比较简单的,例如我们做在Unity3D游戏开发的时候,可能会用到DOTween这个插件。这个插件是iTween的作者重新编写一个动画插件,效率上比iTween有较大的提升。更为重要的一点是,它采用扩展方法这种实现方式,使得我们在调用这些API接口的时候难以感觉到我们是在使用一个插件,更像是在使用Unity3D的原生函数,所以当我们使用DOTween+ uGUI 这样的组合的时候,内心会感到无比的舒畅,一切都像是水到渠成一般。
扩展方法有哪些特点?
扩展方法在实现上和普通的面向对象编程是一样的,换句话说,我们只需要定义一个类,然后在里面添加并实现相应的方法即可。但是这里需要注意的地方有三点,第一,实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关;第二、实现扩展方法的类方法必须是静态方法;第三、实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类。例如,我们知道将一个合法字符串类型转换为整型,可以使用int.parse()方法,假如我们希望为string类型扩展一个ToInt方法应该怎么办呢?我们一起来看下面的这段代码:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /// <summary> /// 1、定义一个静态类 /// 2、静态类的名称和要实现扩展方法的具体类无关 /// </summary> public static class SomeClass { /// <summary> /// 3、实现一个具体的静态方法 /// </summary> /// <param name="str">4、第一个参数必须使用this关键字指定要使用扩展方法的类型</param> /// <returns></returns> public static int ToInt(this string str) { return int.Parse(str); } } |
好了,现在我们编写完这个扩展方法以后,就可以像下面这样使用扩展方法了:
1 2 | string str = "1234"; int val = str.ToInt(); |
1 | transform.position = new Vector3(1,1,1); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1617 | /// <summary> /// 设置Tranform的X坐标 /// </summary> /// <param name="tran">当前Transform</param> /// <param name="x">X坐标</param> public static void SetPositionX(this Transform tran, float x) { tran.position = new Vector3(x, tran.position.y, tran.position.z); } /// <summary> /// 设置Tranform的Y坐标 /// </summary> /// <param name="tran">当前Transform</param> /// <param name="x">Y坐标</param> public static void SetPositionY(this Transform tran, float y) { tran.position = new Vector3(tran.position.x, y, tran.position.z); } /// <summary> /// 设置Tranform的Z坐标 /// </summary> /// <param name="tran">当前Transform</param> /// <param name="x">Z坐标</param> public static void SetPositionZ(this Transform tran, float z) { tran.position = new Vector3(tran.position.x, tran.position.y, z); } |
1 23 | transform.SetPositionX(1.0f); transform.SetPositionY(1.0f); transform.SetPositionZ(1.0f); |
使用扩展方法的利弊
扩展方法使用起来得心应手,所以我们这里来讨论下使用扩展方法的利弊。好处当然是自由而任性地使用扩展方法对类进行扩展,而且扩展方法在Visual Studio中的智能提示会以蓝色向下箭头进行标识。扩展方法的坏处则是要看设计扩展方法的人能否较好的驾驭这个特性啦,其实所有的技术都是一样的,我常常在游戏群里听到人鄙视Unity3D引擎,以UnReal Engine4为游戏引擎世界里的泰山北斗,我承认UE4的画面效果好,可是能真正用好这个引擎的人有多少呢?扩展方法在使用的时候应该遵守就近原则,即是在最小的范围内使用扩展方法,对具体类而非抽象类实现扩展方法。我们使用扩展方法无非是因为它在逻辑层需要这样的功能,所以我们没有必要去改变抽象层的逻辑,因为这样会“污染”整个代码。举一个简单的例子,我们知道.NET中的基类是object,如果我们对这个类进行扩展,毫无疑问它会影响所有继承自object的类,这样就会造成“污染”,显然是不可取的。小结
在C#中实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关实现扩展方法的类方法必须是静态方法
实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类
实现扩展方法应遵守就近原则,在最小的范围内使用扩展方法以避免造成“污染”
版权声明:本文由秦元培创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处,本文作者为秦元培,本文标题为C#中的扩展方法学习总结,本文链接为http://qinyuanpei.com/2015/12/05/extend-methods-of-csharp/.
相关文章推荐
- Unity中的Serializable
- Unity3D-MONO脚本自带函数执行顺序
- Unity3D-PlayerPrefs本地数据保存读取
- Unity3D性能优化总结(转纳金网)
- Unity Shader入门介绍
- Unity5.3Json测试学习
- 使用unity3d 接入anySDK的总结1
- Unity加载和内存管理机制(二)
- Unity加载和内存管理机制(一)
- Drawcall总结-Unity5.X
- 宣雨松版《Unity3D游戏开发》最后章节实战《突出重围》逻辑整理
- unity3d 依据指定的Assets下的目录路径 返回这个路径下的全部文件名称
- “400 Bad Request”解决办法及Unity下载文件保存到本地
- 小米游戏中心sdk接入unity
- iOS与Unity3d的交互实现
- Unity插件之NGUI学习(5)—— 创建Label图文混排及文字点击
- PureMVC for Unity3d Demo
- unity3d中摄像机只看对应的对象.
- unity异步从外部文件加载音频和图片
- Unity封装dll教程整理