420 likes | 548 Views
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8. שיפורים בשפת C#. C# Evolution. מאז הגרסה הראשונה של C# התווספו לה יכולות רבות. על מנת להכיר את היכולות האסינכרוניות החדשות של C# 5 צריך להכיר מקצת מהשיפורים בשפה. Generics.
E N D
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל-Windows 8.1 ואפליקציות ל-Windows Phone 8 שיפורים בשפת C#
C# Evolution • מאז הגרסה הראשונה של C# התווספו לה יכולות רבות. • על מנת להכיר את היכולות האסינכרוניות החדשות של C# 5 צריך להכיר מקצת מהשיפורים בשפה.
Generics • Generics שהוצגו בגרסה C# 2.0 הם הרחבה רבת עוצמה של השפה. • מאפשרת להגדיר אוספים, מחלקות, מבנים, מתודות מבלי להתחייב על הטיפוס בזמן כתיבה. • יתרונות: • Type-Safe – בזמן ההקצאה הקומפיילר יודע בדיוק מה הטיפוס (לא יתכן מצב של 1,2,”3”) • מפחית את השימוש ב- Boxing ו-Unboxing. • שיפור גדול בביצועים. • שימוש חוזר באלגוריתמים (חיפוש, מיון....). • תחביר כללי: שימוש ב- <T> להגדרת טיפוס גנרי אשר יוגדר בזמן ריצה.
Generics לפני Generics: עם Generics:
Generics דוגמה נוספת: • לפני Generics: • עם Generics:
Generics שימושים - List: דוגמת קוד: ListSample דוגמת קוד: GenericListSample
Generics שימושים – יצירת רשימות מותאמות: דוגמת קוד: GenericSample01
Generics שימושים – מתודות גנריות: דוגמת קוד: GenericMethod
Generics הרחבת היכולות של List שימושים – הורשה של List: דוגמת קוד: GenericMethod
Generics שימושים – ממשקים:
Generics הגדרת Delegate גנרי • שימושים – Delegate: הגדרת Event הפעלת Event דוגמת קוד: GenericDelegate
Generics • שימושים – Delegate המשך: רישום ל-Event דוגמת קוד: GenericDelegate
Generics אילוצים (Generic Type Constraint) לכל פריט גנרי יש לפחות פרמטר גנרי אחד אשר צריך לספק בזמן ריצה. .NET מאפשרת להגדיר אילוצים המגבילים את בחירת הטיפוסים בזמן ריצה. האילוצים נבדקים בזמן קומפילציה, אם נחרוג מהמוגדר נקבל שגיאה. רשימת אילוצים:
Generics אילוצים דוגמת קוד: GenericConstraints01
Generics אילוצים דוגמת קוד: GenericConstraints01
Implicit Typing - Var • Beginning in Visual C# 3.0, variables that are declared at method scope can have an implicit type var. An implicitly typed local variable is strongly typed just as if you had declared the type yourself, but the compiler determines the type. The following two declarations of i are functionally equivalent: • Local variables can be given an inferred "type" of var instead of an explicit type. The var keyword instructs the compiler to infer the type of the variable from the expression on the right side of the initialization statement. The inferred type may be a built-in type, an anonymous type, a user-defined type, or a type defined in the .NET Framework class library. For more information about how to initialize arrays with var, see Implicitly Typed Arrays (C# Programming Guide). • The following examples show various ways in which local variables can be declared with var: • It is important to understand that the var keyword does not mean "variant" and does not indicate that the variable is loosely typed, or late-bound. It just means that the compiler determines and assigns the most appropriate type. • The var keyword may be used in the following contexts: • On local variables (variables declared at method scope) as shown in the previous example. • In a for initialization statement. var i = 10; // implicitlytypedint i = 10; //explicitlytyped var i = 5; // s iscompiledas a stringvar s = "Hello"; foreach(var item in list){...}
Anonymous Methods • דוגמת קוד הפשוטה הבאה מציגה הגדרה, רישום והפעלה של delegate: • הבעיה - למעשה המתודה Func שנועדה להיקרא על ידי ה- Delegate יכולה להיקרא על ידי כל חלק אחר של התוכנית מבלי שיוצריה התכוונו לכך. הגדרה רישום הפעלה
Anonymous Methods הגדרה • החל מ- C# גרסה 2.0 ניתן לחבר ישירות בין ה- Delegate לבין קטע הקוד אשר אמור להתבצע כאשר הוא מופעל: • לא צריך להגדיר מתודה בצורה מפורשת אלא כותבים מקטע קוד אשר ירוץ בכל פעם שה-Delegate יופעל, הקומפיילר כבר יודע לייצר את המתודה בזמן קומפילציה. • לא ניתן להפעיל את המימוש ללא ה-Delegate. רישום הפעלה
Anonymous Methods • ועם Event: הגדרה אירוע רישום הפעלה
Lambda Expression • בגרסה 1.0C#Delegate קיבל כתובת של מתודה או של הרבה מתודות. • בגרסה 2.0 של C# התווספה לארסנל היכולות של השפה המתודה האנונימית (Anonymous Method) שאפשרה לחבר ישירות בין ה- Delegate לבין קטע הקוד אשר אמור להתבצע כאשר הוא מופעל. • הגרסה השלישית של C# לוקחת אותנו עוד צעד קדימה ומאפשרת לממש את המתודה האנונימית באמצעות ביטוי למבדה (Lambda Expression). • ביטויי למבדה הם שיטה מאוד תמציתית לכתיבת מתודות אנונימיות על מנת לפשט את האופן בו אנו עובדים עם Delegate ב- C#. • השימוש בביטויי למבדה אינו מוסיף פונקציונאליות או יכולות שלא היו קיימות בגרסאות הקדומות יותר של #C.
Lambda Expression • ביטויי למבדה הם Inline Delegate אשר מציגים תחביר ייחודי לטובת מתודות אנונימיות. • ביטויי למבדה הם פשוטים יותר לשימוש אבל דורשים להסתגל לתחביר שונה ממה שהכרנו עד כה. • ביטוי למבדה מורכב משלושה חלקים: לדוגמה: x => x * x הביטוי מקבל פרמטר בודד הנקרא X, הביטוי עצמו עושה שימוש בפרמטר.הטיפוס של X מוגדר בצורה מרומזת, אולם ניתן להגדירו בצורה מפורשת:לדוגמה: (int x) => x * x;אין הבדל בין ההגדרות, ממילא טיפוס הפרמטר מוכתב על ידי ה- Delegate.לאחר הלמבדה אופרטור (=>) נכתב הביטוי עצמו. • ביטויי למבדה יכול לקבל מספר פרמטרים, במקרה זה הפרמטרים חייבים להיות תחומים בסוגריים, לדוגמה: (n1,n2,n3)=>n1 + n2 + n3 Parameters => Execution Code הפרמטרים של הביטוי, 0 או יותר פרמטרים קוד לביצוע Lambda Operator
Lambda Expression המבנה התחבירי של ביטויי Lambda • מבנה של משפט למבדה: params => expression • params – רשימת פרמטרים שהביטוי מקבל, אופציונאלי. • <= - למבדה אופרטור, סדר הקדימות שלו זהה לאופרטור השמה (=). • expression – הביטוי. לדוגמה:x => x * xהביטוי מקבל פרמטר בודד הנקרא X, הביטוי עצמו עושה שימוש בפרמטר.הטיפוס של X מוגדר בצורה מרומזת, אולם ניתן להגדירו בצורה מפורשת:לדוגמה: (int x) => x * x;אין הבדל בין ההגדרות, ממילא טיפוס הפרמטר מוכתב על ידי ה- Delegate.לאחר הלמבדה אופרטור (=>) נכתב הביטוי עצמו. • ביטויי למבדה יכול לקבל מספר פרמטרים, במקרה זה הפרמטרים חייבים להיות תחומים בסוגריים, לדוגמה: (n1,n2,n3)=>n1 + n2 + n3
Lambda Expression הגדרת Delegate דוגמה: השיטה הוותיקה Anonymous Methods Lambda שימו לב שאין התייחסות לערך המוחזר למרות שה- Delegate מחייב זאת, החזרת הערך מתבצעת בצורה מרומזת. דוגמת קוד: LambdaExpressionSample01
Lambda Expression דוגמה, ביטוי למבדה שמקבל מספר פרמטרים: הגדרת Delegate Lambda דוגמת קוד: LambdaExpressionSample02
Lambda Expression • ביטויי למבדה יכולים להכיל מספר משפטים או פקודות. • במקרה זה הביטוי חייב להיות תחום בסוגריים מסולסלים. • ביטויי למבדה הן חלק בלי נפרד משפתC# ו- NET Framework ולכן ניתן להשתמש בכל פקודות השפה ומחלקות המוגדרות ב- NET Framework בתוך ביטויי למבדה. הגדרת Delegate Lambda Return מפורש דוגמת קוד: LambdaExpressionSample03
Lambda Expression בעקבות הפיתוח של Generics ומהניסיון שהצטבר בשימוש בהם הבחינו מנהלי המוצר של .NET Framework שב-99.99% מהמקרים אנחנו משתמשים רק בשלושה סוגים של Delegate: • Predicate - Delegate שמקבל פרמטר ומחזיר bool. • Action - Delegate שמקבל בין 1-16 פרמטרים ואינו מחזיר ערך. • Func - Delegate שמקבל בין 1-16 פרמטרים ומחזיר ערך. * הערה – השניים האחרונים "מועמסים"
Lambda Expression Predicate Delegate public delegate bool Predicate<T>( T obj ) • Delegate שמקבל פרמטר ומחזיר bool. • מייצג מתודה הבודקת עם הפרמטר עומד בסדרה של קריטריונים. • המתודה List<T>.FindAll(Predicate<T> match) בודקת אלו אובייקטים הנמצאים ב-List עומדים בקריטריונים ומחזירה רשימה שלהם. • היא עושה שימוש ב-Predicate כדי להגדיר את הקריטריונים לביצוע הבדיקה.
Lambda Expression דוגמת קוד - Predicate Delegate דוגמת קוד: LambdaExpressionSample04
Lambda Expression Action Delegate public delegatevoidAction<T>( T obj ) Delegate שמקבל בין 1-16 פרמטרים ואינו מחזיר ערך (Overloading). כשמו כן הוא, מייצג פעולה בלבד. למבדה תוך שימוש ב-Action Delegate למבדה תוך שימוש ב-Action Delegate דוגמת קוד: LambdaExpressionSample06
Lambda Expression Action Delegate List<T>.ForEach( Action<T> action) דוגמת קוד: LambdaExpressionSample07
Lambda Expression למבדה תוך שימוש ב-Func Delegate Func Delegate public delegate TResultFunc<T, TResult>( T arg ) Delegateשמקבל בין 1-16 פרמטרים ומחזיר ערך. מייצג פעולה עם ערך מוחזר. למבדה תוך שימוש ב-Func Delegate למבדה תוך שימוש ב-Func Delegate דוגמת קוד: LambdaExpressionSample08
Lambda Expression Func Delegate List<T>.Average<TSource> Method (IEnumerable<TSource>, Func<TSource, Decimal>) דוגמת קוד: LambdaExpressionSample09
Lambda Expression ביטויי למבדה ב- List List מכילה מספר פונקציות המתבססות על ביטויי למבדה. בדוגמאות הבאות נתבסס על ה- List הבא: מיון: דוגמת קוד: LambdaExpressionSample10
Lambda Expression מיון בסדר יורד: סינון: דוגמת קוד: LambdaExpressionSample10
Lambda Expression מיון ע"פ קריטריון: קיבוץ:
Lambda Expression בדוגמאות הבאות נתבסס על ה- List הבא: בחירת שדה: שרשור ביטויים 1: דוגמת קוד: LambdaExpressionSample10
Lambda Expression שרשור ביטויים 2: דוגמת קוד: LambdaExpressionSample10
Lambda Expression למבדה ואירועים: דוגמת קוד: LambdaExpressionWithWPF
Lambda Expression שעשועי למבדה:
Lambda Expression שעשועי למבדה:
Lambda Expression שעשועי למבדה - פתרונות דוגמת קוד: LambdaEX
את הסילבוס, חומרים, מצגות ניתן להוריד ב: www.corner.co.il