C#的扩展方法
C#扩展方法
一、扩展方法的作用:
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C#编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。
二、示例:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ConsolePro
{
class Program
{
static void Main(string[] args)
{
string[] strArr = new string[] { "apple", "orange", "banana" };
string concatStr = strArr.ToConcatString(',');
Console.WriteLine(concatStr);//结果:apple,orange,banana
Console.Read();
}
}
public static class Extension
{
/// <summary>
/// 链接字符串数组方法
/// </summary>
/// <param name="strs"></param>
/// <param name="concatChar">链接字符串之间的链接字符</param>
/// <returns></returns>
public static string ToConcatString(this string[] strs, char concatChar)
{
StringBuilder build = new StringBuilder();
foreach (var item in strs)
{
build.AppendFormat("{0}{1}", item, concatChar);
}
return build.ToString().TrimEnd(concatChar);
}
}
}
注解:扩展方法需要声明为static的,它所处的类也必须是static的。
三、本质:
从IL中我们可以看到扩展方法与其扩展的类之间并没有什么本质的联系,只是编译器跟我们玩的把戏罢了,最终编译器还是将扩展方法转化成静态类的静态方法调用,所以扩展方法不能访问相应类的私有字段和私有方法;至于为什么使用静态类的静态方法,我考虑可能是这样效率相对较高,同时扩展方法作为其他类的扩展,本身类的实例化没有什么意义;
如何被扩展的类中的方法和扩展方法一样的话,调用该方法的时候被扩展的类自身的方法的优先级高,所以扩展方法会被隐藏掉。所以说如果我们对.NET的基本类库的类写扩展方法后,然后这个基础类在.NET的后面的版本发布中有了和我们之前写的扩展方法一样签名的方法的话;我们之前写的扩展方法就会被覆盖掉。所以说扩展方法是一个不稳定的,容易别覆盖隐藏。所以尽量少用扩展方法。
四、总结:
- 扩展方法不会改变被扩展的类的代码,所以不需要对被扩展的类进行重新编译。
- 扩展方法是没办法访问被扩展类的私有成员的,因为扩展方法本质上就不是被扩展类的成员。只是我们C#给我们提供一种使用 “被扩展类”的实例来间接调用我们编写的扩展放而已。
- 因为在扩展方法和被扩展类中的方法有相同签名的情况下,扩展方法会被隐藏,所以扩展方法是不稳定的,尽量不要滥用扩展方法。

浙公网安备 33010602011771号