//先看几个例子

//为StringBuilder扩展一个Indexof方法和一个ToUpper方法
public static class StringBuilderExtensions
{
//该扩展方法返回字符首次出现的索引 public static int Indexof(this StringBuilder sb, Char values) { for (int index = 0; index < sb.Length; index++) { if (sb[index] == values) { return index; } } return 789686; }
//将小写转为大写 public static string ToUpper(this StringBuilder sb)//这个方法并没有几毛钱意义。。。 { return sb.ToString().ToUpper(); } }
//创建一个静态类
//扩展一个ShowIteam方法,分行打印
//任何表达式只要它最终的类型实现了IEnumerable<T>接口即可调用该方法 static public class A { public static void ShowIteams<T>(this IEnumerable<T> collection) { foreach (var item in collection) { Console.WriteLine(item); } } }

namespace 枚举 { class Program { static void Main(string[] args) { StringBuilder sb = new StringBuilder("abcd,1234/efg"); int index1 = StringBuilderExtensions.Indexof(sb.Replace('/', '.'), '.'); string index2 = StringBuilderExtensions.ToUpper(sb); Console.WriteLine(index2); Console.WriteLine(index1); //单独显示每个char "Grant".ShowIteams(); //单独显示每个string new[] { "abc", "bcd", "cde" }.ShowIteams(); //单独显示每个int new[] { 1, 2, 3, 4 }.ShowIteams(); Console.ReadKey();
//输出结果依次为

//ABCD,1234.EFG
//9
//G
//r
//a
//n
//t
//abc
//bcd
//cde
//1
//2
//3
//4

        }
    }
}

  以上为几个扩展方法的例子          曹衍涛

  以下为关于扩展方法的一些规则和原则:

1.c#只支持扩展方法,不支持扩展属性、扩展事件、扩展操作符等

2.扩展方法(第一个参数前面有this的方法)必须在非泛型的静态类中声明。类名没有限制,可以随便起。扩展方法至少有一个参数,而且只有第一个参数能用this关键字标记

3.c#编译器查找静态类中的定义扩展方法时,要求这些静态类本身必须具有文件作用域。如果静态类镶嵌在另一个类中会报错。

4.由于静态类可以取任何名字,所以c#编译器要花一定时间类来寻找扩展方法,他必须检查文件作用域中的所有静态类,并扫描他们所有的静态方法来查找一个匹配。

5.多个静态类可以定义相同的扩展方法。当编译器检测到存在两个或多个扩展方法需要显示指定静态类的名称,告诉编译器要调用哪个方法。

6.用一个扩展方法扩展一个类时,同时也扩展了派生类型。所以不要将System.Object用作扩展方法的第一个参数,否则这个方法在所有表达式类型上都能调用。

7.扩展方法有潜在版本控制问题,加入未来Microsoft为StringBulider类添加了一个IndexOf实例方法,而且与上述代码师徒调用的原型一样,编译器会用Microsoft的方法

 

posted on 2017-01-17 14:14  懒人起烂名  阅读(347)  评论(0编辑  收藏  举报