学习来源:https://www.cnblogs.com/opop/p/5553803.html
扩展方法的目的就是为一个现有类型添加一个方法,现有类型既可以是int,string等数据类型,也可以是自定义的数据类型。
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
简单说就是某个类,他不能动,但是需要新增一个方法,这时候就需要使用扩展方法。
一个简单的示例:
using UnityEngine;
public class NewBehaviourScript1 : MonoBehaviour
{
void Start()
{
string str1 = "str1";
string str2 = "str2";
string str3 = str1.MegerString(str2);//string对象可以直接调用到这个方法。
Debug.Log(str3);
}
}
public static class Test
{
//定义一个合并字符串的方法
//参数中使用this开头,表示作用于string这个类型
//因此在传入时,需要在一个string的类型上传入,str2的参数
public static string MegerString(this string str1, string str2)
{
return str1 + str2;
}
}
自建类的用法:
public class NewBehaviourScript1 : MonoBehaviour
{
void Start()
{
Duck duck1 = new Duck("red");
Duck duck2 = new Duck("blue");
duck1 = duck1.MegerDuck(duck2);
Debug.Log(duck1.Name);
}
}
public static class Test
{
public static Duck MegerDuck(this Duck Duck1, Duck Duck2)
{
Duck newDuck = new Duck("");
newDuck.Name = Duck1.Name + Duck2.Name;
return newDuck;
}
}
public class Duck
{
//一个普通类
public string Name;
public void Eat() { }
//构造函数
public Duck(string name)
{
Name = name;
}
}
使用准则:
通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现。
只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。
在使用扩展方法来扩展你无法更改其源代码的类型时,你需要承受该类型实现中的更改会导致扩展方法失效的风险。
如果你确实为给定类型实现了扩展方法,请记住以下几点:
如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。
在命名空间级别将扩展方法置于范围中。 例如,如果你在一个名为 Extensions 的命名空间中具有多个包含扩展方法的静态类,
则这些扩展方法将全部由 using Extensions; 指令置于范围中。
针对已实现的类库,不应为了避免程序集的版本号递增而使用扩展方法。
总结:能不用就不用
网友评论