1. 扩展方法的定义
通过前一节的实例学习,我们了解到:扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。使用扩展方法,可以向现有类型“添加”方法。
下面,再给出一个实例,希望通过对这个实例的学习,能进一步加深对扩展方法的理解。
首先,创建扩展方法:
public static class ExtendFunction { public static void Print(this object o) { Console.WriteLine(o); } }
接下来,添加方法调用的代码:
static void Main(string[] args) { // string s = "hell,world!"; s.Print(); // int i = 32; i.Print(); }
执行程序,得到以下结果:
在这个实例中,扩展方法接收的参数类型为object,所以,对于任意的 object 使用这个方法应该都是合法的。于是,在前面代码的基础上,增加一个TestClass类,并使用该类的实例来调用这个方法,看看结果如何。新的代码如下:
class TestClass { public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } public bool IsMarried { get; set; } public String Note { get; set; } public TestClass() { Name = "tiana0"; Age = 1800; Sex = "非人类"; IsMarried = false; Note = "1800岁的非人类,你敢嫁给他吗"; } } class Program { static void Main(string[] args) { // string s = "hell,world!"; s.Print(); // int i = 32; i.Print(); // TestClass testClass = new TestClass(); testClass.Print(); } }
执行结果如下:
很显然,使用自己定义的类的实例来调用这个方法也是可行的,只是,输出的是类的名称信息,要想输出类的成员信息,可以使用下面的代码:
testClass.Name.Print(); testClass.Age.Print(); testClass.Sex.Print(); testClass.IsMarried.Print(); testClass.Note.Print();
再次执行程序,结果为:
这样,类的成员信息也可以被输出了。
这里可能会用人问,我们使用TestClass.Print() 可不可以呢?结果很显然,各位,你们说呢。
2.扩展方法跟普通的实例方法又有什么区别?
对于用 C# 编写的代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。
3.什么样的方法可以作为扩展方法呢?
这种方法,必须具备以下几个特征:
l 它必须在一个非嵌套的,非泛型的静态类中;
l 它至少要有一个参数;
l 第一个参数必须附上this关键字作为前缀;
l 第一个参数不能有其他任何修饰符(如out或ref);
l 第一个参数的类型不能是指针类型。
今天,就讲到这里,下一节,我们将会通过一个实例,来学习扩展方法何时被调用。