方法的分类有:
- 静态方法(方法声明中用staic修饰)
- 实例方法
- 虚方法(方法声明时用virtual修饰)
- 重写方法(方法声明时用override修饰)
- 密封方法(方法声明时用sealed修饰)
- 抽象方法(方法声明时用abstract修饰)
- 外部方法(方法声明时用extern修饰)
- 分部方法(方法声明时用partial修饰)
- 扩展方法(方法的形参列表中的第一个形参使用this修饰)
扩展方法:其实是声明在非嵌套、非泛型的静态类中,为实现某种特殊功能,而为该类型追加的静态方法;
示例:原生的string类,不具有ToInt32()方法,我们通过学习扩展方法,为其声明一个ToInt32()扩展方法
//第一步:声明一个顶级静态类--这里类名的命名规范一般是 待扩展的目标类型+Extension后缀--如:StringExtension
static class MyExtension
{
//第二步:声明一个带第一个形参带this修饰的静态方法(两步完成对string类型的方法扩展)
/// <summary>
/// 为strin类型提供扩展方法
/// </summary>
/// <param name="strValue">待转换的string类型值</param>
/// <returns>转换成功后的int类型值</returns>
public static int ToInt32(this string strValue)
{
int rtnValue = 0;
if (int.TryParse(strValue,out rtnValue))
{
return rtnValue;
}
return rtnValue;
}
}
在Main方法中调用这个扩展方法---当我们通过string类型实例intStr调出可用的方法列表时,可以通过↑ ↓ 箭头找到我们定义的ToInt32()方法;它有一个不同于其它普通方法的图标
string intStr = "12";
var result_value= intStr.ToInt32();
Console.WriteLine(result_value);//输出:12
示例:原生数组Array类型,不支持"切片"功能,我们通过自定义扩展方法,让数组具有切片功能;
static class MyExtesion
{
/// <summary>
/// 为strin类型提供扩展方法
/// </summary>
/// <param name="strValue">待转换的string类型值</param>
/// <returns>转换成功后的int类型值</returns>
public static int ToInt32(this string strValue)
{
int rtnValue = 0;
if (int.TryParse(strValue,out rtnValue))
{
return rtnValue;
}
return rtnValue;
}
/// <summary>
/// 为泛型数组提供扩展方法--切片功能
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="arrs">待切片数组</param>
/// <param name="index">从arrs的index处开始</param>
/// <param name="count">截取长度为count的元素</param>
/// <returns>切片后形成的新数组</returns>
public static T[] Slice<T>(this T[] arrs, int index, int count)
{
T[] rtnArr = null;
if (index < 0 || count < 0 || arrs == null || arrs.Length - index < count)
{
return rtnArr;
}
else
{
rtnArr = new T[count];
Array.Copy(arrs, index, rtnArr, 0, count);
return rtnArr;
}
}
}
在Main方法中调用切片扩展方法
string[] ssArr = new string[] { "12","33","45","32","87","22"};
var retult_arr = ssArr.Slice(3,2);
if (retult_arr!=null)
{
foreach (var item in retult_arr)
{
Console.WriteLine(item.ToInt32());
}
}
//输出:32 87
扩展方法在开发中使用场景特别广泛,但是要注意尽量不要对object类型进行扩展方法的声明;此外扩展方法在Linq中发挥出了巨大的作用,比如我们使用的lists.Where()就是扩展方法
以上便是对扩展方法的总结,记录下来,以便以后查阅。