C# 为类型扩展方法

本文介绍了C#中的扩展方法,这是一种特殊静态方法,允许向现有类型添加方法而无需修改原始类型。内容包括扩展方法的创建(需定义静态类和带有`this`修饰符的静态方法)、调用(通过被扩展类型实例调用)及其应用场景,并提供了示例代码,如扩展`string`类去除空格的方法。
摘要由CSDN通过智能技术生成

 

声明:本CSDN博客中的所有文章均为本人原创 请勿转载

C# 类型扩展方法

什么是扩展方法?

扩展方法使您能够向现有类型(或接口) 添加 方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法 ,但可以像扩展类型 上的实例方法一样进行调用。对于用 C# Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。(源于 MSDN

1 )扩展方法的创建

      首先需要定义一个准备包含扩展方法的静态类

Public class EnlargeClass   {

         // 加入扩展方法

}  

      其次,向该类添加一个静态的方法

        该方法的第一个参数必须以   this 修饰符开头。形参为 需要将该方法绑定到的类型。这一参数不需要使用者在调用处显式提供。接下来的形参则根据方法需要添加。

如:

  public static returnType   MethodName (this ClientClass refObj , // 由编译器识别并填充

                                  parameterType   parameter // 由调用者使用的参数

                                  ……

                                 ) 

   注: 1. ClientClass 表示你要绑定到的类型。编译器根据这一类型来决定该方法绑定到那种类型上。

          refObj 表示当前的对象。即调用者的实例的一个引用。

        2. 指示绑定到的类型的参数必须由 this 修饰。从这一点可以看出。 This 关键字表示了 EnlargeClass 在当前的上下文的一个引用。

         注意: refObj 并不是一个指向同一对象的指针。它是一个原对象的引用复本,是否能够影响到原对象取决于原对象的类型(引用或者值类型)。

        3. 指示类型绑定的参数必须处于该方法的第一个位置。 这样编译器不会关注下面的参数列表。否则将不能通过编译。

         4. 在创建扩展方法时,需要保证该方法对使用点是可访问的。

          5. 如果定义了一个和原类成员相同的扩展方法,则编译器优先于原类型方法。所以,编写扩展方法时要注意不能和原类方法重名。

   

可以向 .net 的所有类型和自定义的类型添加扩展方法。

在扩展方法的静态类中,可以为多个类型绑定方法。

为什么语言设计者要使用静态形式绑定方法呢?和程序的入口 Main 函数一样,静态的调用不容易受到对类型构造的考虑和影响。但编程者却需要注意访问权限的修饰。

 

 

为了考察一下你的理解回答一个问题。能不能将 string ,char,baty,int 等基本数据类型进行方法扩展?并解释原因。

 

2 )扩展方法的调用

  扩展方法的调用是使用原被扩展的类型的实例 来调用的。从表面看,对象调用静态方法是乎不合常理。事实上在被编译器编译为 IL 时会自动转换为对扩展类静态方法的调用。

  扩展方法并不属于原类型中的成员。它只是一种外接的功能。所以,扩展方法无法访问原类型的内部私有成员 。但扩展方法是否可以操作原类的公共属性呢?根据上面的理解,你应该能很回答这个问题。如果还不清楚,请尝试写几个小示例。答案就不用公布了。

 

调用一个扩展方法的步骤如下:

首先需要使扩展类在当前环境下可见。如果扩展方法创建在其它命名空间,请引入该命名空间。

       当引入扩展类的命名空间时,编译器就会在检查时对你所扩展的类型加入创建的静态方法。事实上,系统并没有真正的向原类添加任何函数成员。只是将当前可见的该类型产生的所有对象绑定了该方法。

  例如:使用上面创建的扩展

      假设 ClientClass 类为 .net 定义的 Int

      那么, Int32 myInt=new Int();

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值