c#

位置:IT落伍者 >> c# >> 浏览文章

.net framework3.5新特性2:新增匿名类[3]


发布日期:2021年09月12日
 
.net framework3.5新特性2:新增匿名类[3]

扩展方法

这个世界上总是存在着很多奇妙的东西然而在这部分所介绍的扩展方法就是其中之一从字面上看可能读者很难猜透扩展方法是什么意思然而看了下面的例子就会感觉到非常的奇妙

namespace ExtMethod{public class Class{public String s = bill;}public class Class : Class{}public static class AnyClassName{public static String getName(this Class class){return classs + classs; }}public partial class Form : Form{private void button_Click(object sender EventArgs e){Class c = new Class();MessageBoxShow(cgetName()); Class c = new Class();MessageBoxShow(cgetName()); }}}

看到上面的代码也许很多人会感到奇怪在Class和Class中并没有getName方法怎么在调用时出来个getName方法呢?实际上这就是扩展方法的用法从本质上说扩展方法就是将静态方法(必须声明成static)插入到某个类和其子类中(也就是说在这些类中可以使用在外部定义的静态方法)那么要往哪个类中插入呢?这就要在定义静态方法时指定了大家可以看看getName方法的第一个参数使用了this关键字这就表明这个方法是一个扩展方法后面的类型就是要插入该方法的类在本例中是Class也就是说在Class及其子类中都可以使用getName方法上面的调用代码也相当于下面的代码

Class c = new Class();

MessageBoxShow(AnyClassNamegetName(c));

但使用cgetName可能会更好一些而且也降低了对静态方法所在的类(AnyClassName)的依赖性

在使用扩展方法时应注意以下几点

扩展方法所在的类名可以是任意合法的类名

扩展方法所在的类必须和使用扩展方法的代码在同一个命名空间里否则无法编译通过

在本例中Class和Class只能声明成public因为AnyClassName被声明为public如果AnyClassName不加修饰符Class和Class也可以不加修饰符当然也可以被声明为public也就是说Class和Class必须有比AnyClassName具有更强的访问性如下面代码所示

class Class{public String s = bill;}class Class : Class{}static class AnyClassName // 这时如果前面加public是无法编译通过的{public static String getName(this Class class){return classs + classs; }}

如果在Class或Class中已经有getName方法了那么Class或Class中的getName优先级更高也就是说扩展方法是无法覆盖原类中的同名(参数名和类型也相同)的方法的

扩展方法尤其在很多类需要同样的方法而这些类又无法继承其它类时特别有用当然在要对某个类进行扩展但我们并没有源代码时扩展方法也可以派上用场

[] [] []

               

上一篇:.net framework3.5新特性2:新增匿名类[1]

下一篇:.net framework3.5新特性2:新增匿名类[2]