../images/Emo41.gifVisual C# 2005 Beta 1../images/Emo41.gif
בעקבות ההשקה החגיגית של הדור הבא (2005) של כל מה שקשור בתכנות בדוט נט, (וגם בעקבות הזמן הפנוי שנוצר מהרגילה שלקחתי
) חשבתי שיהיה ראוי לציין כמה מהתכונות החדשות של #C גרסה 2.0. 1.Generics מה כבר יש לכתוב על Generics שעוד לא נכתב?
ובכל זאת, למי שמגיע מעולם ++C, הרעיון של Generics לא יהיה זר לו, כיוון שהוא דומה ל-Templates של ++C. לטובת מי שלא יודע מה זה templates, אני אסביר: Generics היא היכולת לכתוב מחלקות (או interfaces או delegates או מתודות אפילו) כלליות, שמשתנות במקצת בהתאם לפרמטר type שונה. לדוגמא, למחלקה List יהיה יישום שונה אם הרשימה היא רשימה של int או של string. זה אומר שאפשר לכתוב מחלקה מסוימת באופן כללי, לדוגמא <List<T, ורק כשמשתמשים בה "למלא את החסר", ולציין את הסוג של הרשימה - <List<int>, List<string>, List<MyClass. ניתן גם להעביר כמה פרמטרים, כמו במקרה של Dictionary, שבו מציינים מהו הסוג של המפתח, ומהו הסוג של הערך. לדוגמא: <Dictionary<int, string. Generics קודם כל נותן לנו type safety. עד עכשיו, בגרסאות המוקדמות יותר של דוט נט, היינו צריכים להצהיר על ArrayList שיכול להכיל object-ים. מצב זה יכול לגרום (שלא בכוונה), להכנסת משתנים מטיפוסים לא נכונים לרשימה, שכן אין ממש בדיקה על הסוג של מה שנכנס לרשימה. את ה-Exception נקבל כשננסה לעשות casting כששולפים את המשתנה מהרשימה. דוגמא:
מי שרוצה ללמוד עוד על Generics - http://lab.msdn.microsoft.com/library/en-us/dv_csref/html/75ea8509-a4ea-4e7a-a2b3-cf72482e9282.asp?frame=true 2. Iterators איטרטורים הם מתודות, שמחזירות מספר רב של ערכים, שניתן לעבור עליהם באמצעות לולאת foreach. בעצם, המתודות האלו מחזירות IEnumerable, שהוא כמו "מצביע" לרשימה שמחזירים. במתודה איטרטורית תופיע לולאה אחת לפחות, עם הוראת yield return, שאומרת שאנחנו מוסיפים את הערך לרשימה המוחזרת.. לדוגמא:
היתרון פה הוא שהמתודה נקראת, תוך כדי מעבר חיצוני של מי שקרא לה על הנתונים המוחזרים. מי שרוצה ללמוד עוד על Iterators - http://lab.msdn.microsoft.com/library/en-us/dv_csref/html/f45331db-d595-46ec-9142-551d3d1eb1a7.asp?frame=true. 3. Anonymous Methods בגדול, מתודות אנונימיות, כשמן כן הן - מתודות ללא שם. מתודות אלו נוצרות on the fly, ע"י הקומפיילר. ניתן למקם מתודה אנונימית בכל מקום שבו הקומפיילר מצפה שיהיה delegate, לדוגמא:
גלעד.
בעקבות ההשקה החגיגית של הדור הבא (2005) של כל מה שקשור בתכנות בדוט נט, (וגם בעקבות הזמן הפנוי שנוצר מהרגילה שלקחתי
ArrayList al = new ArrayList(); // we can put both strings and ints in the list - no type-safety. al.Add(1); al.Add("Hello world"); int x = (int)al[0]; // ugly casting. int y = (int)al[1]; // woops! InvalidCastException will be thrown!
ב-Generics, כל הבדיקות האלו נעשות ב-compile time, כיוון שהגדרנו מראש מאיזה סוג הרשימה שלנו:List<int> myList = new List<int>(); myList.Add(24); myList.Add("bla bli blo"); //Throws a compile time error! int x = myList[0]; // Look ma, no casting!
החסכון ב-casting חוסך גם בביצועים. עם generics, ה-CLR לא צריך לבדוק שה-cast שלנו מתאים, והכי חשוב - אין צורך בפעולות box ו-unbox יקרות כשמתעסקים עם primitives. כמו כן, גם מתודות, interfaces, ו-delegates יכולים להיות ג'נריים, לדוגמא:public T Add(T value1, T value2) { //.... }
ניתן גם להוסיף constaints על אובייקטים גנריים, אבל זה לא הזמן והמקום לפרט
public IEnumerable GetValues() { for (int i = 0; i < m_List.Count; i++) { yield return m_List; } }
היתרון פה הוא שהמתודה נקראת, תוך כדי מעבר חיצוני של מי שקרא לה על הנתונים המוחזרים. מי שרוצה ללמוד עוד על Iterators - http://lab.msdn.microsoft.com/library/en-us/dv_csref/html/f45331db-d595-46ec-9142-551d3d1eb1a7.asp?frame=true. 3. Anonymous Methods בגדול, מתודות אנונימיות, כשמן כן הן - מתודות ללא שם. מתודות אלו נוצרות on the fly, ע"י הקומפיילר. ניתן למקם מתודה אנונימית בכל מקום שבו הקומפיילר מצפה שיהיה delegate, לדוגמא:
myButton.Click += delegate { MessageBox.Show("Forum .net rules"); };
זה עוזר לנו ליצור קוד נקי יותר, ללא תופעות כמו מתודות שנוצרות "רק בשביל ה-event", כמו myButton_Click, או MyThread_Work, וכו'. מתודות אנונימיות הוא נושא גדול יותר, לפרטים: http://lab.msdn.microsoft.com/library/en-us/dv_csref/html/a62441fa-f0a3-4acb-9aa6-93762a635275.asp?frame=true. 4. Partial Classes יצירת partial classes היא היכולת לכתוב מחלקה הנפרשת על פני יותר מקובץ אחד. את זה משיגים ע"י הכללת המילה partial בהצהרה על המחקלה:// myFile1.cs public partial class X { public void f(); } //myFile2.cs public partial class X { public int z; }
בדוגמה, הצהרנו למעשה על מחלקה אחת, שההצהרה עליה נפרשת על פני שני קבצים. הפיצ'ר הנחמד הזה מקל את החיים על designers למיניהם, כאשר חצי אחד של המחלקה נכתב ע"י ה-designer בקובץ אחד, והחצי השני שנכתב ע"י המתכנת נמצא בקובץ שני. ישנם עוד כל מיני תוספות קטנות לשפה כמו static classes, accessor accesibility, וכו'. ניתן לקרוא עליהן ב-MSDN. בתקווה לעוד רגילות בקרוב