Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)delvpublished in(发表于) 2014/1/6 9:05:33 C#,3.0新特性初步研究,Part2:使用扩展方法_[Asp.Net教程]
扩展方法(Extension Method)可以为已有的类型添加新的方法定义和实现,比如int类型目前没有一个名叫xxxyyy()的方法,那么通过使用扩展方法,我们可以为int类型添加一个xxxyyy()方法。这个有点类似于用来扩展系统功能的某些设计模式。
下面我们用代码来说话:这是我们以前的写法:
1public static class Extensions 2{ 3 public static string CamelCase(string identifier) 4{ 5 string newString = ""; 6 bool sawUnderscore = false; 7 8 foreach (char c in identifier) 9 {10 if ((newString.Length == 0) && Char.IsLetter(c))11 newString += Char.ToUpper(c);12 else if (c == '_')13 sawUnderscore = true;14 else if (sawUnderscore)15 {16 newString += Char.ToUpper(c);17 sawUnderscore = false;18 }19 else20 newString += c;21 }2223 return newString;24} 25}2627static void Main(string[] args)28{29string[] identifiers = new string[] { 30 "do_something", 31 "find_all_objects", 32 "get_last_dict_entry" 33 };3435foreach (string s in identifiers)36 Console.WriteLine("{0} becomes: {1}", s, Extensions.CamelCase(s));37}38C# 3.0中我们可以这样写: 1public static class Extensions 2{ 3 public static string CamelCase(this string identifier) 4{ 5 string newString = ""; 6 bool sawUnderscore = false; 7 8 foreach (char c in identifier) 9 {10 if ((newString.Length == 0) && Char.IsLetter(c))11 newString += Char.ToUpper(c);12 else if (c == '_')13 sawUnderscore = true;14 else if (sawUnderscore)15 {16 newString += Char.ToUpper(c);17 sawUnderscore = false;18 }19 else20 newString += c;21 }2223 return newString;24} 25}2627static void Main(string[] args)28{29string[] identifiers = new string[] { 30 "do_something", 31 "find_all_objects", 32 "get_last_dict_entry" 33 };3435foreach (string s in identifiers)36 Console.WriteLine("{0} becomes: {1}", s, Extensions.CamelCase(s));37}主要是下面这两个语句的变化:1public static string CamelCase(this string identifier)2Console.WriteLine("{0} becomes: {1}", s, s.CamelCase());变量s原本是一个string类型,并没有CamelCase()方法,但是我们在CamelCase()方法的参数列表最前面加上一个this关键字,则string s就拥有了一个新的方法CamelCase,很简单也很直接 :)
下面我们看一看一个稍微复杂一点的应用: 1public static class Extensions 2{ 3public static List Combine(this List a, List b) 4{ 5 var newList = new List(a); 6 newList.AddRange(b); 7 return newList; 8} 9}1011static void Main(string[] args)12{13var odds = new List();14odds.Add(1);15odds.Add(3);16odds.Add(5);17odds.Add(7);1819var evens = new List();20evens.Add(0);21evens.Add(2);22evens.Add(4);23evens.Add(6);2425var both = odds.Combine(evens);26Console.WriteLine("Contents of 'both' list:");27foreach (int i in both)28 Console.WriteLine(i);29}
来源:网络
赞