如果針對一個類型實例的代碼片段經常被用到,我們可能會想到把之封裝成幫助方法。如下是一段針對DateTime
類型實例的一段代碼:
class Program
{
static void Main(string[] args)
{
DateTime d = new DateTime(2001,5,18);
switch (d.DayOfWeek)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
DoWeekendThing();
break;
default:
DoWeekDayThing();
break;
}
Console.ReadKey();
}
static void DoWeekendThing()
{
Console.WriteLine("周末好好休息放松心情");
}
static void DoWeekDayThing()
{
Console.WriteLine("認真工作");
}
}
?
以上,把判斷是否是周末的代碼片段封裝到幫助類、幫助方法中如下:
?
public static class DateTimeHelper
{
public static bool IsWeekend(DateTime dateTime)
{
switch (dateTime.DayOfWeek)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
return true;
default:
return false;
}
}
}
?
在客戶端:
?
class Program
{
static void Main(string[] args)
{
DateTime d = new DateTime(2001,5,18);
if (DateTimeHelper.IsWeekend(d))
{
DoWeekendThing();
}
else
{
DoWeekDayThing();
}
Console.ReadKey();
}
static void DoWeekendThing()
{
Console.WriteLine("周末好好休息放松心情");
}
static void DoWeekDayThing()
{
Console.WriteLine("認真工作");
}
}
?
用幫助類、幫助方法固然好,因為進行了很好的封裝,但每次都必須要記住擴展方法在DateTimeHelper
這個擴展類中。如果System.DateTime
包括IsWeekend
方法會更好!
?
擴展方法是一種特殊的靜態方法,可以讓編寫的方法像現有類型的實例方法一樣被使用。
public static class DateTimeExtensions
{
public static bool IsWeekend(this DateTime dateTime)
{
switch (dateTime.DayOfWeek)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
return true;
default:
return false;
}
}
}
○ 擴展方法必須在靜態類中
○ 擴展方法必須是靜態方法
○ 擴展方法的第一個參數必須是需要被擴展的類型,而且前面必須加this
關鍵字??
?
客戶端修改為:
class Program
{
static void Main(string[] args)
{
DateTime d = new DateTime(2001,5,18);
if (d.IsWeekend())
{
DoWeekendThing();
}
else
{
DoWeekDayThing();
}
Console.ReadKey();
}
static void DoWeekendThing()
{
Console.WriteLine("周末好好休息放松心情");
}
static void DoWeekDayThing()
{
Console.WriteLine("認真工作");
}
}
?
總結:擴展方法貌似略好于幫助方法,可以作為類型實例的方法直接被調用。