如果针对一个类型实例的代码片段经常被用到,我们可能会想到把之封装成帮助方法。如下是一段针对DateTime类型实例的一段代码:
classPRogram
{
staticvoidMain(string[] args)
{
DateTime d =newDateTime(2001,5,18);
switch(d.DayOfWeek)
{
caseDayOfWeek.Saturday:
caseDayOfWeek.Sunday:
DoWeekendThing();
break;
default:
DoWeekDayThing();
break;
}
Console.ReadKey();
}
staticvoidDoWeekendThing()
{
Console.WriteLine("周末好好休息放松心情");
}
staticvoidDoWeekDayThing()
{
Console.WriteLine("认真工作");
}
}
以上,把判断是否是周末的代码片段封装到帮助类、帮助方法中如下:
publicstaticclassDateTimeHelper
{
publicstaticboolIsWeekend(DateTime dateTime)
{
switch(dateTime.DayOfWeek)
{
caseDayOfWeek.Saturday:
caseDayOfWeek.Sunday:
returntrue;
default:
returnfalse;
}
}
}
在客户端:
classProgram
{
staticvoidMain(string[] args)
{
DateTime d =newDateTime(2001,5,18);
if(DateTimeHelper.IsWeekend(d))
{
DoWeekendThing();
}
else
{
DoWeekDayThing();
}
Console.ReadKey();
}
staticvoidDoWeekendThing()
{
Console.WriteLine("周末好好休息放松心情");
}
staticvoidDoWeekDayThing()
{
Console.WriteLine("认真工作");
}
}
用帮助类、帮助方法固然好,因为进行了很好的封装,但每次都必须要记住扩展方法在DateTimeHelper这个扩展类中。如果System.DateTime包括IsWeekend方法会更好!
扩展方法是一种特殊的静态方法,可以让编写的方法像现有类型的实例方法一样被使用。
publicstaticclassDateTimeExtensions
{
publicstaticboolIsWeekend(thisDateTime dateTime)
{
switch(dateTime.DayOfWeek)
{
caseDayOfWeek.Saturday:
caseDayOfWeek.Sunday:
returntrue;
default:
returnfalse;
}
}
}
○ 扩展方法必须在静态类中
○ 扩展方法必须是静态方法
○ 扩展方法的第一个参数必须是需要被扩展的类型,而且前面必须加this关键字
客户端修改为:
classProgram
{
staticvoidMain(string[] args)
{
DateTime d =newDateTime(2001,5,18);
if(d.IsWeekend())
{
DoWeekendThing();
}
else
{
DoWeekDayThing();
}
Console.ReadKey();
}
staticvoidDoWeekendThing()
{
Console.WriteLine("周末好好休息放松心情");
}
staticvoidDoWeekDayThing()
{
Console.WriteLine("认真工作");
}
}
总结:扩展方法貌似略好于帮助方法,可以作为类型实例的方法直接被调用。