Where
- מגבלות על הפרמטרים
ניתן להגדיר מגבלות על הפרמטרים הגנרים אותם נקבל – T לא יהיה מכל סוג כלשהו אלא יהיה חייב לעמוד במגבלות שנדרוש
דוג'
public class Program
{
static void Main(string[] args)
{
stam s = new stam();
List<int> nums
= new List<int>();
nums.Add(8);
nums.Add(18);
s.show(nums);
List<men>
nums2 = new List<men>();
nums2.Add(new men());
s.show(nums2);
}
}
public class stam
{
public void show<T>(List<T>
items) where T:IComparable<T>
{
foreach (var item in items)
{
Console.WriteLine(item);
}
}
}
public class men
{
public string name { get; set; }
}
הפונקציה הזאת תקבל רשימה אבל רק רשימה לפי התנאי - הגדרה
היא שרק רשימות בעלי אפשרות להשוואה יוכלו לעבור לפונקציה ולכן רשימה של אובייקטים
לא יכולים לעבור ובשורה המסומנת נקבל הודעת שגיאה
ניתן לגדיר משתנה גלובלי שמוגבל למחלקה ספציפית שכל משתנה יוכל להתקבל
אך רק מאותה המחלקה
שים לב - זה לא הורשה !!!
Attribute
Attribute – תוספת שנותנים לפונקציה \ קלאס –
לשנות את ההתנהגות שלה ללא נגיעה בפונקציה
Obsolete - הודעה. במידה ויש שדה\פונקציה\מחלקה שאנחנו
רוצים להוציא משימוש אבל היא עדיין נצרכת בקוד ישן כך שלא שייך למחוק אותה – נשתמש
ב Obsolete - התכונה
של הפונקציה היא שהיא מיושנת וכשמישהו יקרא לפונקציה הוא יקבל אזהרה שזה פונקציה
מיושנת
שים לב - attribute נכתב בסוגריים מרובעות
לפני הפונקציה\שדה.
[Obsolete]
public static string Method1()
{
return "You have called
Method1.";
}
ניתן גם להשאיר הודעה שתצורף לאזהרה של המערכת
[ObsoleteAttribute("This
method will soon be deprecated. Use MethodNew instead.")]
או
לבצע חסימה – בקריאה לפונקציה תתקבל שגיאת קומפילציה (כשאין ערך זה שווה ל false)
[ObsoleteAttribute("This method has been deprecated" true)]
Serializable
כשאנחנו יוצרים אובייקט ביישום מסגרת .Net צוריך לחשוב על האופן שבו הנתונים
נשמרים בזיכרון. כי .Net Framework
דואג לזה אבל אם אנחנו רוצים להעביר את המידע לקובץ(טקסט או XML) \
ברשת \או לתהליך אחר במחשב צריך להמיר את המידע לתבנית שניתן להעביר.
Serializable הוא Attribute שממיר את האובייקט לרצף טקסט – או להפך מקבל רצף טקסט וממיר לאובייקט
Extension Method
כשיש לי מחלקה סגורה ואני לא רוצה לנגוע בה אבל צריך להוסיף פונקציה
או במקרה שקניתי קובץ DLL שעושה סט פעולות ואני
רוצה להוסיף פעולה משלי ניתן להגדיר פונקציה חיצונית שנכנסת לתוך המחלקה
בדוג' הזאת יש קובץ שמצורף לפרויקט עם מחלקה בשם Geek שלה יש פונקציה print הוספנו פונקציה וקישרנו
אותה באמצעות הפקודה this Geek g_stam – עכשיו כשאנחנו
יוצרים אובייקט מהמחלקה Geek יש לנו גם את הפונקציה
הזאת. ברשימה היא מסומנת עם חץ מטה שמראה שזה פונקציה שהגיע ממקור חיצוני
public class GFG
{
public static void Main(string[] args)
{
Geek g1 = new Geek();
g1.print();
g1.MetLocali();
}
}
public static class stam
{
public static void MetLocali(this Geek g_stam)
{
Console.WriteLine("Method Name: MetLocali");
}
}
anonymous type
עד היום למדנו שאובייקטים
מגיעים ממחלקה שמכילה שדות או מתודות אך ניתן גם ליצור אובייקט תוך כדי ריצה עם
משתנים אנונימיים (זה לא אומר שכל מה שלמדנו לא נכון... לטיפוס אנונימי יש מספר
מגבלות ולכן משמש עבור דברים ספציפיים)
דוג'
var user = new
{
Name = "dodo",
Age = 42
};
Console.WriteLine(user.Name + " - " +
user.Age + " years old");
1.
יש להגדיר את
האובייקט באמצעות המשתנה var + new
2. יוצרים את השדות ללא צורך בהכרזה על סוג המשתנה – הקומפיילר מזהה לבד
את הסוג ומבצע את ההגדרה
LINQ
Language Integrated Query ובקיצור LINQ - שפה הצהרתית דמוית SQL לביצוע שאילתות
שמייקרוסופט שילבה בתוך הדוט נט במטרה שהמתכנת יתעסק יותר במה שהוא רוצה לקבל ולא
בדרך לקבלת המידע
1. בC# נתונים רבים נשמרים בתוך מערך \אוסף \ רשימה וחלק ניכר מזמן המפתח
מוקדש לביצוע מניפולציות על מידע. ובשביל זה נכתוב פונקציה שתעבור על האוסף ותבחר רק את הערכים
שעומדים בתנאים. באמצעות LINQ נוכל לבצע את זה בצורה
הרבה יותר מהירה ויותר קריאה
2. לעיתים מידע מגיע ממספר סוגים של מקורות נתונים, עובדה זו מקשה עלינו
המפתחים בשל הצורך ללמוד ולהכיר "שפות" שונות וטכניקות שונות, LINQ - מספקת לנו מודל ותחביר אחידים לטיפול במידע ללא קשר למקור
הנתונים ממנו הוא מגיע,
Linq מאפשרת
ביצוע שאילתות חיפוש, סינון, סידור, צירוף, איחוד לקבוצות של נתונים וכו'.
ב-Linq ניתן להשתמש בשתי דרכים: הראשונה בתחביר ייעודי שהפך להיות חלק מתחביר השפה והשניה היא אוסף מתודות
ייעודיות העושות שימוש בביטויי למבדה תוך שימוש ב- Func<T>
delegate ומסתירות את התחביר הבסיסי ובכך
להפחית את כמות הקוד הנדרש למספר שורות בודדות
מבנה תחבירי בסיסי
int[] myArr = { 10, 20, 8, 2 };
var result = from num in myArr
where (num % 2) == 0
select num;
1. var result - הגדרת משתנה אנונימי שיקבל את התוצאה של השאילתה
2. from - שאילתה חייבת להתחיל במילה השמורה
from.
3. num - משתנה שמיצג את האלמנטים שמתקבלים מהמקור –
סוג המשתנה מוגדר אוטומטית לפי הערכים שהתקבלו
4. in myArr - מקור המידע עליו מתבצעת השאילתה מוגדר באמצעות
המילה השמורה in
5. Where - (אופצינאלי) משמש להגדרת
התנאים לשאילתה
6. select מגדיר את הטיפוס של האלמנטים שיוצרו
כתוצאת השאילתה
שאילתות Linq ניתן להריץ גם על אוסף
אובייקטים
לדוג'
יצרנו רשימה של אובייקטים
ואז עושים שאילתה שמשתנה Healthy יקבל רק אובייקטים שעומדים בתנאי
namespace testlinq
{
class Program
{
static void Main(string[] args)
{
List<IceCream> IceCreams = new List<IceCream>
{
new IceCream {Description="vanilla" , calories=200, Vitamins=30 ,weight=99},
new IceCream {Description="banana" , calories=50, Vitamins=10 ,weight=50},
new IceCream {Description="coffe" , calories=30, Vitamins=70 ,weight=90},
new IceCream {Description="chocolad" , calories=105, Vitamins=80 ,weight=500},
};
var Healthy = from c in IceCreams
where ((c.calories < 80) && (c.Vitamins
> 30))
select c2;
foreach (var item in Healthy)
{
Console.WriteLine(item.Description);
}
}
}
public class IceCream
{
public string
Description { get; set; }
public int calories
{ get; set; }
public int Vitamins
{ get; set; }
public int weight {
get; set; }
}
}
שימוש ב Lambda
Lambda – היא פונקציה
אנונימית שמקבלת פרמטרים מבצעת פעולה אריתמטית ומחזירה תוצאה
ניתן לראות בדוג' הבאה שבאמצעות שורה אחת הפעלנו
פונקציה שתחזיר רק את מה שעומד בתנאי וגם תמיין את הרשימה לפי סדר עולה
int[] nums = new int[]
{1,4,2,6,3,8,3,1,2,5,9};
var result = nums.Where(n => n
> 5).OrderBy (n => n);
<= - לך
אל nums.Where(n => n > 5) - n בפונקציה מקבל את מה ששלחנו ושולח לבדיקה
ו
result יקבל בחזרה רק את מה שSRUE
דוג' נוספת של סינון רשימת אובייקטים
static void Main(string[]
args)
{
List<IceCream> IceCreams = new
List<IceCream>
{
new IceCream {Description="vanilla"
, calories=200, Vitamins=30 ,weight=99},
new IceCream {Description="banana"
, calories=50, Vitamins=10 ,weight=50},
new IceCream {Description="coffe"
, calories=30, Vitamins=70 ,weight=90},
new IceCream {Description="chocolad"
, calories=105, Vitamins=80 ,weight=500},
};
var Healthy = IceCreams.Where(c
=> c.calories > 70).Select(c => c);
foreach (var item in Healthy)
{
Console.WriteLine($"the
iceCreams {item.Description} weight is {item.weight}");
}
}
אין תגובות:
הוסף רשומת תגובה