因為在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中,亦算是符合一般程式概念.
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.
回覆刪除Ya, It Seem the Wordpress theme make some confliction.
回覆刪除