C# 中的增加方法

我对扩张方法的敞亮就是一个工具类。

       在 java 中并未这么的东西,一个类一旦是 final 的
,那么些类就不可能再被抬高方法, 不过 C# 可以不辱任务,能够给 sealed
类添加新的主意,那一点自己或者相比较欣赏 c# 的。这就是 C# 中的扩充方法。

那么哪些意况下大家才须求去给一个类写伸张方法吧?

  1. 系统自带的门类,大家鞭长莫及去修改;
  2. 修改源代码须求较大的生机,而且恐怕会带来错误;
  3. 咱俩只是需求一个要么较少的多少个办法,修改源代码费时困难;
  4. 被增添的类是 sealed 的,不能被接二连三;(尽管不是 sealed
    的,大家也不可以因为急需一个主意而去写一个子类,那样不是面向对象)

下边是增添方法的多个元素:(也终于语法规则)

  1. 恢宏方法必须处于一个静态类中;
  2. 壮大方法必须是一个静态方法;
  3. 扩大方法的参数列表必须以 this 起初,this
    后边紧跟的是被增加类,然后才是方式须要的参数;

上面就举一个板栗:

咱俩一般将字符串类型的数字转换为int类型,一般都是用的 int.Parse()
方法,或者 Convert类的格局,我们能不可能给 string 类型添加一个
Parse方法呢?

自然是足以的,代码上来先:(那里只写了无参数的增加方法,有参数的直白在参数列表中拉长即可,调用时传递对应参数)

using System;

namespace ConsoleApplicationTest
{
public static class stringExtensionMethod
{
public static int Parse(this string str)
{
return int.Parse(str);
}
}

class Program
{
static void Main(string[] args)
{
string str = “111”;
int i = str.Parse();
Console.WriteLine(“i: ” + i);
}
}
}

 

      
有几许恐怕倒霉领会,为何参数列表里面有参数,然则在调用的时候却不传递参数,对于那点自己事先也是有点迷糊,但是想通了就好了,那里不是有个
this 关键字呢?this指代的就是眼前目的嘛,
也就是被扩充类的实例,也就是扩充方法的调用者,既然是调用者,那还把它当参数传,肯定不传呀。

上边写一下恢宏方法的特征:

  1. this
    关键字紧跟着的不是参数,而是调用者,调用者前面的参数才是扩展方法确实的参数,在调用时务必传递;
  2. 即使被增加的类中的实例方法和扩大方法的不二法门签名相同(扩张方法中方法的签约应该要去掉
    this 和调用者参数),则优先调用本类中的实例方法;
  3. 被增加类(可以是普通类,也足以是接口抽象类)的子类对象可以直接调用父类的扩展方法,也就是说子类也一而再了父类的增添方法;
  4. 这点终于第 3
    点的互补,唯有被扩充类的本类对象或者子类对象,才能调用扩张方法;

相关文章