知识大全 新增匿名类[3]
Posted 知
篇首语:亦余心之所善兮,虽九死其犹未悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 新增匿名类[3]相关的知识,希望对你有一定的参考价值。
四 扩展方法
这个世界上总是存在着很多奇妙的东西 然而 在这部分所介绍的扩展方法就是其中之一 从字面上看可能读者很难猜透 扩展方法 是什么意思 然而 看了下面的例子 就会感觉到非常的奇妙
namespace ExtMethodpublic class Class public String s = bill ;public class Class : Class public static class AnyClassNamepublic static String getName(this Class class )return class s + class s; public partial class Form : Formprivate void button _Click(object sender EventArgs e)Class c = new Class ();MessageBox Show(c getName()); Class c = new Class ();MessageBox Show(c getName());看到上面的代码 也许很多人会感到奇怪 在Class 和Class 中并没有getName方法 怎么在调用时出来个getName方法呢?实际上 这就是扩展方法的用法 从本质上说 扩展方法就是将静态方法(必须声明成static)插入到某个类和其子类中(也就是说 在这些类中可以使用在外部定义的静态方法) 那么要往哪个类中插入呢?这就要在定义静态方法时指定了 大家可以看看getName方法的第一个参数 使用了this关键字 这就表明这个方法是一个扩展方法 后面的类型就是要插入该方法的类 在本例中是Class 也就是说在Class 及其子类中都可以使用getName方法 上面的调用代码也相当于下面的代码
Class c = new Class ();MessageBox Show(AnyClassName getName(c));但使用c getName可能会更好一些 而且也降低了对静态方法所在的类(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 class s + class s;如果在Class 或Class 中已经有getName方法了 那么Class 或Class 中的getName优先级更高 也就是说 扩展方法是无法覆蓋原类中的同名(参数名和类型也相同)的方法的
扩展方法尤其在很多类需要同样的方法 而这些类又无法继承其它类时特别有用 当然 在要对某个类进行扩展 但我们并没有源代码时 扩展方法也可以派上用场
cha138/Article/program/net/201311/15230相关参考