今天在看WPF视频的时候,遇到了在参数列表中写了this的案例,第一次见到。
public static void AddSlideFromRight
(this Storyboard storyboard,
float seconds,
double offset,
float decelerationRatio=0.9f)
{
}
具体方法体我们就不看了,只看在定义方法的参数列表中的第一个参数,写的:this Storyboard storyboard
Storyboard 代表了参数类型,this关键字表示了该方法是Storyboard类型的扩展方法。
关于扩展方法,有如下几点需要注意的地方:
1. 扩展方法是一种特殊的静态方法,虽然是静态方法,但是可以像使用类型上的实例方法一样去使用扩展方法(调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异)。
2. 扩展方法的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符为前缀。
3. 扩展方法必须在非范型静态类中定义。
为了便于理解以上的几点概念,特意尝试了一下,对string类型进行扩展:
//必须在静态类中定义扩展方法
public static class Program
{
private static void Main(string[] args)
{
string myString = "Hello World!";
myString.ExtensionMethod();
Console.Read();
}
//自定义string类型的扩展方法
public static void ExtensionMethod(this string myString)
{
Console.WriteLine(myString);
}
}
以下是控制台的输出结果:
其实,提到扩展方法,就应该想到自己第一次接触的这个概念,是在学习Action和Function的时候,当初研究Where方法就有涉及。下面我们来看一下关于List的Where扩展方法:
List<int> numbers = new List<int>() { 1,3,5,6,8};
numbers.Where(x=>x>5);
//这里是常规用法
List<int> newnumbersA= numbers.Where(x => x > 5).ToList();
foreach (var item in newnumbersA)
{
Console.WriteLine(item);
}
Console.WriteLine("\n\n\n\n");
List<int> newnumbersB =
//因为是定义在静态类中的静态方法,因为也可以直接用调用静态方法的方式去执行
Enumerable.Where(newnumbersA, x => x > 5).ToList();
foreach (var item in newnumbersB)
{
Console.WriteLine(item);
}
从输出结果可以看出,对于扩展方法:
类的实例.静态扩展方法()
和
静态类.静态扩展方法()
效果是等同的。
最后贴一张图来总结一下: