擴展方法(Extension Methods)是對現有的數據類型實現一些自定義的操作的方法。善用擴展方法能有效地提高開發效率,減少很多冗餘的代碼。就我自己而言,其中一個最大的用途莫過於在Unity的使用上,對Vector3、Vector2、Color等數據類型進行更便捷的變換。
在一般情況下,這類數據類型的變換的代碼都會顯得非常多餘。比如我想對物體的當前Position的Z軸增加10,我是不可以直接:
transform.position.z += 10;
而必須:
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + 10);
這樣一個簡單的變換,都要寫一段這麼長的代碼,費時費力,但只要對Vector3寫一個擴展方法,一切都會變得簡單很多。
擴展方法的具體寫法
一、首先創建一個靜態類
public static class ExtensionMethods{ }
二、定義一個靜態方法(我在這裡就以Vector3類型用於快捷修改z值的擴展方法為例)
public static class ExtensionMethods
{
public static Vector3 Z(){ }
}
三、定義方法需要的形參
public static class ExtensionMethods
{
public static Vector3 Z(this Vector3 value, float z){ }
}
*this Vector3 value 這個參數是使用時自動傳值的,代表著使用這個擴展方法的Vector3數據。比如transform.position.Z,那這裡的value就是transform.position自身。
*後面的float z就是具體想改變的目標值了
四、最後就是編寫具體的函數體了(這裡以快捷修改z值為例)
public static class ExtensionMethods
{
public static Vector3 Z(this Vector3 value, float z)
{
Vector3 newValue = value;
newValue.z = z;
return newValue;
}
}
五、這樣寫完之後,就可以通過以下這種簡潔的方法對位置信息進行修改了
transform.position = transform.position.Z(transform.position.z + 10);
一點總結
上面修改Vector3 z值只是一個很簡單的例子,除了Vector3這些unity特有的數據類型以外,int、float、string等等基本的C#數據類型也可以通過上面的步驟寫一些提高開發效率的擴展方法。
擴展方法實際上並沒有提高運行的效率,就結果而言,仍然是new了一個Vector3,然後賦值,再返回出去,但是只要有了這個shortcut,就能重覆使用,大幅提高寫代碼的效率。其實這種將重覆的工作抽象出來,封裝成一個方法,從而提高代碼的複用性,也是我們做面向對象編程時的一個核心思想。