总结:用处在不破坏原有类封装的情况下给它添加新的方法,这样可以不需要修改这个类的源代码,也不需要再另外的继承一个类添加方法。

C#中的扩展方法及用途 - 森大科技 - 博客园 (cnblogs.com)

static void Main(string[] args)

        {

            DateTime now = DateTime.Now;

            string time = now.ToString("yyyy-MM-dd HH:mm:ss");

            Console.WriteLine(time);

            Console.ReadKey();

        }

 

假设需求变了,日期的显示格式要变成"yyyy-MM-dd"这种格式,当然只需要初始化time时按下面写法改写即可:

string time = now.ToString("yyyy-MM-dd");

但是如果要改变日期格式的有很多个类呢?每个都要改一次吗?这样一旦需求变来变去就忙死人了。传统的解决方式是封装一个帮助类,在里面写方法,然后供其他类调用。

本例在当前项目模仿添加一个DateHelper类:public class DateHelper{},在类里面定义方法:

public static string DateToString(DateTime dt)

        {

            return dt.ToString("yyyy-MM-dd HH:mm:ss");

        }

于是原来的主函数改写如下:

 

static void Main(string[] args)

        {

            DateTime now = DateTime.Now;

            string time = DateHelper.DateToString(now);

            Console.WriteLine(time);

            Console.ReadKey();

        }

 

此时如果变需求,只需要改写DateHelp类里的DateToString()方法就行了,不管有多少个类调用此方法,都会被影响。问题解决了,可是这样要调用另一个类的方法,还是有点麻烦,有没有什么方法能够让我们像now.DateToString()一样直接调用呢?当然DateTime是微软写好的,我们改不了,无法创建想要的实例方法,于是,便引出了扩展方法。

下面是扩展方法的要素:

1.此方法必须是一个静态方法

2.此方法必须放在静态类中

3.此方法的第一个参数必须以this开头,并且指定此方法是扩展自哪个类型

根据以上要素,我们DateHelper类改成静态类:public static class DateHelper{} ,同时改写DateToString()方法:

public static string DateToString(this DateTime dt)

        {

            return dt.ToString("yyyy-MM-dd HH:mm:ss");

        }

此时回到主函数方法体,输入"now."便可以看见自动提示有个DateToString()方法,于是代码可以这样写:

 

static void Main(string[] args)

        {

            DateTime now = DateTime.Now;

            string time = now.DateToString();

            Console.WriteLine(time);

            Console.ReadKey();

        }

好处当然是自由而任性地使用扩展方法对类进行扩展,坏处是与类的封装性相斥可能会造成代码污染