2008年3月31日星期一

C# - Worth To Use Extension Methods

對於經常在VisualBasic和C#之間往來的我來說,會明白到C# Strong Type的好處,但同時亦覺得VB語法寬鬆的好處.
因為在C#中要經常做轉型(Convert.ToString / .ToString etc) , 在VB中,Object可以和Integer相加 , 在C#的話, 就肯定是出現Error.

這一陣子寫Silverlight的時間,經常有很多object type出現,由於是coordinate,所以必須轉換成Double.

就以下面的Code為例,ImgBall的GetValue是object type,不能就這樣做operation,所以必須用Convert.ToDouble轉型,但單單一小節Code,已經出現3次:
if (Convert.ToDouble(ImgBall.GetValue(Canvas.LeftProperty)) < Convert.ToDouble(ImgPaddle.GetValue(Canvas.LeftProperty)) + 5)
{
ImgBall.SetValue(Canvas.LeftProperty, Convert.ToDouble(ImgPaddle.GetValue(Canvas.LeftProperty)) + 5);
}

Extension Methods的出現可大大降低程式碼的長度,效能雖然沒有得益,但增加程式碼的可讀性.
以下我就示範一下如何透過Extension Methods令整個程序更美觀.

建立一個Class檔案 (ext.cs) ,在Namespace低下加入:
public static class ext
{
/// <summary>
///  Get Dependency Object and Convert to Double.
/// </summary>
public static Double GetDouble(this Image img, DependencyProperty property)
{
return Convert.ToDouble(img.GetValue(property));
}

/// <summary>
///  Get Canvas.LeftProperty From Image.
/// </summary>
public static Double GetCanvasLeft(this Image image)
{
return GetDouble(image, Canvas.LeftProperty);
}
/// <summary>
///  Get Canvas.TopProperty From Image.
/// </summary>
public static Double GetCanvasTop(this Image image)
{
return GetDouble(image, Canvas.TopProperty);
}
}

以上程序就是把Property引入,並進行類型轉換,要注意緊記加入"static"的Modifier.

回到開始的部份,我們已經可以在Image Member中找到GetCanvasLeft 和GetCanvasTop,直接引用就已經可以得到Double類型的數值了,是不是簡短很多呢~
if (ImgBall.GetCanvasLeft()  < ImgPaddle.GetCanvasLeft() + 5)
{
ImgBall.SetValue(Canvas.LeftProperty, ImgPaddle.GetCanvasLeft() + 5);
}

其實某程度上Extension Methods和傳統的Function相似,都是可以引入Parameter , return數值等等, 但Extension Methods是指定在某一個類別下衍生出功能,當實際使用時就會依據類別而出現於Member List中,亦算是符合一般程式概念.

2 則留言:

  1. Thanks! that is very helpful. Moreover, that is just a suggestion. I found that is a bit hard to read for C# code in the blog. Can you increase the font size a bit.

    回覆刪除
  2. Ya, It Seem the Wordpress theme make some confliction.

    回覆刪除