前言
扩展方法可以在不继承或者修改类里面的内容,进行类方法的扩展,他可以假装是这个类的实例方法,实际上这是编译器内部帮我们进行了修改
扩展方法的条件
- 扩展方法必须是一个非嵌套、非泛型的静态类,静态类里面必须是静态方法(如果要使用泛型可以使用泛型方法)
- 第一个参数只能是this关键词作为前缀
- 第一个参数不能是指针类型
扩展方法的例子
namespace ListExtensionTest
{
public static class ListExtension//扩展方法的定义
{
public static void ReadListElement<T>(this List<T> list, Action<T> action)
{
foreach (var temp in list)
{
action(temp);
}
}
}
public class Film
{
public string Name { get; set; }
public int Year { get; set; }
}
public class Program
{
static void Main(string[] args)
{
var films = new List<Film>
{
new Film{Name = "Some like it hot", Year = 1978},
new Film{Name = "The Wizard of oz", Year = 1998},
new Film{Name = "Jaws", Year = 1975},
new Film{Name = "Sing in the Rain", Year = 2000},
};
films.ReadListElement(x => Console.WriteLine(x.Name + " and " + x.Year));// 扩展方法的使用
}
}
}
这边可以理解为 list调用ReadListElement方法 参数为Action
当你鼠标放在扩展方法的时候可以显示extension来区别扩展方法和实例方法
扩展方法不会抛出空指针异常。
总结
- 不能盲目的使用扩展方法,要尽可能避免让代码维护人员感觉奇怪(我自己目前还是有点迷惑)
- 合理的使用命名空间
- 扩展方法linq中大量的使用可以学习参考
- 个人感觉扩展方法用起来还是很爽的