1 הבסיס כתיבת התכנית הראשונה שימוש במשתנים הטיפוס הבסיסי object הטיפוס הבסיסי string משפטי בקרה שימוש ב- Enumerations שימוש ב- Namespaces המתודה Main כתיבת הערות פקודות קדם מהדר
2 כתיבת התכנית הראשונה ניתן לפתח ב-# C הן באמצעות ה- Studio Visual והן באמצעות שורת הפקודה. להלן קוד המקור של התכנית הראשונה שנפתח. using System; namespace abelski.csharp class HelloWorld static void Main() Console.WriteLine("Hello World!"); באתר של הספר תוכל למצוא שני וידאו קליפים אשר מסבירים כיצד להדר וכיצד להריץ תכנית זו. וידאו קליפ אחד מסביר כיצד לעשות זאת כאשר עובדים משורת הפקודה. הוידאו קליפ השני מסביר כיצד לעשות זאת כאשר עובדים עם ה-.Visual Studio
3 שימוש במשתנים הגדרה של משתנים נעשית משמאל לימין בדומה לשפות אחרות. יש לציין תחילה את הטיפוס של המשתנה ולאחריו את שמו. datatype identifier; כך למשל, שורות הקוד הבאות מגדירות שני משתנים. משתנה אחד בשם num מטיפוס double ומשתנה שני בשם.int מטיפוס index double num; int index; בסוף כל שורת קוד יש למקם את הסימן ;. לאחר שמשתנה נוצר ניתן להכניס לתוכו ערך באמצעות אופרטור ההשמה. בדומה לשפות תיכנות אחרות, אופרטור ההשמה ב-# C הוא הסימן '='. num = 12.2; index = 2; משתנים מקומיים (משתנים שמוגדרים בתוך גוף של מתודה) חייבים לאתחל לפני שמשתמשים בהם. אם לא נעשה זאת נקבל טעות קומפילציה. כאשר מגדירים משתנה ניתן להשתמש במילה השמורה var במקום ציון הטיפוס המדוייק שבו מעוניינים. במקרה כזה, בזמן ביצוע הקומפילציה הקומפיילר יבחן את הטיפוס של הערך המוכנס ויקבע את הטיפוס של המשתנה שסומן ב- var בהתאם. בדוגמת הקוד הבאה מודגם השימוש ב- var. using System; namespace abelski.csharp class VarDemo static void Main() var sum = 100.24; var number = 242;
4 var name = "Haim Michael"; var question = true; Type sumtype = sum.gettype(); Type numbertype = number.gettype(); Type nametype = name.gettype(); Type questiontype = question.gettype(); Console.WriteLine("The type of sum is "+sumtype.tostring()); Console.WriteLine("The type of number is "+numbertype.tostring()); Console.WriteLine("The type of name is "+nametype.tostring()); Console.WriteLine("The type of question is "+ questiontype.tostring()); הפלט שנקבל הוא:
5 כדי להגדיר קבוע יש להשתמש במילה השמורה const באופן הבא: const int max = 10; חייבים לאתחל אותו ברגע ההגדרה שלו. לאחר שהקבוע נוצר לא ניתן לשנות את ערכו. כאשר מסמנים כ- const משתנה שמוגדר במחלקה הוא נהייה למשתנה static באופן אוטומאטי. הערכים ב-# C נחלקים לשני סוגים. סוג אחד קרוי בשם value type וסוג שני קרוי בשם.reference type כאשר מאחסנים בתוך משתנה ערך מסוג value type המשתנה יאחסן את הערך עצמו. כאשר מאחסנים בתוך משתנה ערך מסוג reference type המשתנה יאחסן בתוכו את ה- reference לאותו ערך בלבד. משתנה שיכול להכיל,reference type כלומר, משתנה שיכול להכיל בתוכו את ה- reference לערך מסוים יכול גם להכיל בתוכו את הערך.null גם כאשר עובדים עם משתנים מטיפוס value type מאחורי הקלעים נוצרים אובייקטים אשר פועלים בשמם. זו הסיבה לכך שניתן לקרוא להפעלתן של מתודות באמצעות משתנים שמכילים ערכים מסוג value type כאילו היה מדובר במשתנים שמכילים בתוכם references לאובייקטים. מאחורי הקלעים המתודה תופעל על האובייקט שפועל בשמו של המשתנה.
6 הטיפוס הבסיסי object object הוא הטיפוס הבסיסי שממנו יורשים על הטיפוסים האחרים. השם object הוא קיצור לשם המפורט והמלא של המחלקה:.System.Object במחלקה זו מוגדרות המתודות החשובות הבאות: ToString() Equals() GetHashCode() GetType() כיוון שכל המחלקות האחרות יורשות ממחלקה זו, מתודות אלה ניתנות להפעלה על כל אובייקט מכל מחלקה שיש לנו בתכנית.
7 הטיפוס הבסיסי string הטיפוס הבסיסי string הוא הטיפוס שמשמש לייצוג של מחרוזות תווים. המילה string היא שם מקוצר לשם המפורט של המחלקה:.System.String לאחר שנוצר אובייקט מטיפוס string אשר מייצג טקסט מסוים לא ניתן לשנות את הטקסט שהוא מייצג.
8 משפטי בקרה שפת התיכנות #C תומכת במשפטי הבקרה הבאים. משפט if התחביר של משפט ה- if ומשפט ה- else if ב-# C דומה לתחביר המוכר משפות אחרות כגון Java ו-++ C. יש לרשום את המילה if ואחריה בתוך סוגריים עגולות את הביטוי הבוליאני. אם ערכו true אז המשפט שיופיע בהמשך יתבצע. אם ערכו של הביטוי false אז המשפט שיופיע בהמשך לא יתבצע. כדי למנוע בילבול מקובל להשתמש במשפט מורכב (בלוק) במקום משפט פשוט. if(...)... משפט if ומשפט if else דומה למשפט if פשוט. בהמשך לאחר המשפט מוסיפים את המילה else ולאחריה משפט נוסף. אם ערכו של הביטוי false אז המשפט הנוסף הוא שיתבצע. כדי למנוע בילבול מקובל להשתמש במשפטים מורכבים (בלוקים) במקום במשפטים פשוטים. if(...)... else...
9 משפט ה- switch התחביר דומה לתחביר שמוכר משפות תכנות אחרות. רושמים את המילה switch ומיד אחריה בתוך סוגריים רושמים ביטוי. בזמן ריצה מחושב ערכו של הביטוי ומתבצע ה- case בהתאם לערך שחושב. switch(expression) case constant_expression_1: code... break; case constant_expression_2: code... break; default: code... break; להבדיל משפות תכנות אחרות, שפת התכנות #C מאפשרת לבחון במשפט switch ביטוי מטיפוס.string כמו כן, שפת התכנות #C לא מאפשרת למקם שני cases עם ערך זהה והיא לא מאפשרת ליותר מ- case אחד להתבצע. לולאת for שפת התיכנות #C תומכת בלולאת for בדומה לשפות התכנות האחרות. התחביר דומה ואופן הפעולה זהה. for(intializer; condition; iterator)... תפקיד הביטוי הראשון (ה- initializer ) הוא לאתחל את ערכו של המשתנה שפעולת הלולאה מתבססת עליו. תפקיד הביטוי השני (ה- condition ) הוא להוות תנאי לוגי שכל עוד הוא נכון הלולאה ממשיכה לפעול. תפקיד הביטוי השלישי הוא לקדם את ערכו של המשתנה שעליו מתבססת פעולת הלולאה.
10 using System; התכנית הבאה מדפיסה את כל המספרים מ- 1 עד 9 באמצעות לולאת for פשוטה. namespace abelski.csharp class ForLoopDemo static void Main() for(int i=0; i<10; i++) Console.WriteLine(i); הפלט שנקבל הוא:
11 לולאת while התחביר של לולאת while ב-# C דומה לתחביר של לולאת while בשפות תיכנות אחרות. יש לרשום את המילה while ומייד אחריה בתוך סוגריים עגולות את הביטוי הלוגי, שכל עוד הוא יהיה true הלולאה תתבצע. While(...)... לולאת do...while התחביר של לולאת do..while דומה לתחביר המוכר משפות תיכנות אחרות. יש לרשום את המילה do ומייד אחריה את המשפט (מקובל לרשום משפט מורכב... בלוק) שהלולאה מבצעת. לאחר המשפט (המשפט המורכב) יש לרשום את המילה while ומייד אחריה בתוך סוגריים עגולות את הביטוי הלוגי שכל עוד הוא true הלולאה תתבצע. Do... while(...); להבדיל מלולאת while לולאת do while מתבצעת פעם אחת לפחות. לולאת foreach לולאה זו מאפשרת לנו לעבור על כל האלמנטים שמוחזקים ב- collection ו/או מערך ו/או כל אובייקט אשר נוצר foreach(type parameter in collection) statement ממחלקה שמיישמת את.IEnumerable בדוגמת הקוד הבאה נעשה שימוש בלולאה מסוג foreach כדי לעבור על כל האלמנטים במערך נתון.
using System; namespace abelski.csharp class ForEachDemo static void Main() int []vec; vec = new int[4]; vec[0]=12; vec[1]=14; vec[2]=16; foreach(int temp in vec) Console.WriteLine(temp); Console.ReadLine(); 12
13 שימוש ב- Enumeration באמצעות enum ניתן להגדיר type חדש שכל מופע שלו הוא ערך מספרי שלם מסוים שמזוהה עם שם. public enum Day Sunday = 1, Monday = 2, Tuesday = 3, Wednesday = 4, Thursday = 5, Friday = 6, Saturday = 7 השימוש בערכים האפשריים של enum שהגדרנו נעשה באמצעות ציון שם ה- enum בתוספת השם שמזוהה עם אחד Day today = Day.Sunday; הערכים המספריים האפשריים.
14 שימוש ב- Namespaces ה namespace הוא יחידה לוגית אשר מתחמת טווח הכרה סביב כל המחלקות אשר שייכות אליה. באמצעות namespaces ניתן לארגן את המחלקות באופן יותר מסודר. השימוש ב- namespace יוצר טווח הכרה חדש. כדי לשייך מחלקה שאנו מגדירים ל- namespace מסויים יש להגדירה בתוך סוגריים מסולסלות אשר תוחמות את טווח ההגדרה של ה- namespace. כך למשל, בדוגמת הקוד הבאה המחלקה Utils מוגדרת כמחלקה ששייכת ל- using System; namespace abelski.csharp public class Utils public static int Sum(int num1, int num2) return num1+num2;.abelski.csharp ששמו namespace כאשר מחלקה שייכת ל- namespace מסויים בכל מקום שבו רוצים להשתמש בה יש לרשום את השם המלא שלה אשר כולל את שם המחלקה + שם ה- namespace שאליו היא שייכת. int sum = Abelski.csharp.Utils.Sum(4,32); ניתן להימנע מכתיבת השם המלא והארוך אם נשתמש ב- directive. השימוש ב- directive כולל את השימוש במילה השמורה using בצירוף השם של ה- namespace שבמחלקה ששייכת אליו רוצים להשתמש. באמצעות directive ניתן לייבא מחלקה שבה אנו רוצים להשתמש ובכך אנו יכולים להימנע מציון השם המלא שלה.
15 המתודה Main זוהי המתודה העיקרית. זוהי נקודת ההתחלה של כל אפליקציה. היא חייבת להיות static והערך המוחזר שלה חייב להיות int או.void הרשאת הגישה שלה יכולה להיות כל הרשאה. ניתן להגדיר אותה עם פרמטר מסוג מערך של.strings במקרה כזה, ערכים שיישלחו אל האפליקציה בעת הפעלתה משורת הפקודה יישלחו כ- strings שמוחזקים במערך אל המתודה.Main using System; namespace abelski.samples public class ParametersToMainDemo public static void Main(String []vec) for(int i=0; i<vec.length; i++) Console.WriteLine(vec[i]);
16 כתיבת הערות קיימות מספר דרכים לכתיבת הערות בתוך קוד המקור. ניתן לכתוב הערות בסגנון C: /*... */ ניתן לכתוב הערות בסגנון ++C: // ניתן לכתוב הערות בסגנון ייחודי ל-# C אשר יילקחו לקובץ ה- documentation : ///
17 פקודות קדם מהדר בדומה ל-++ C ול- C ניתן לשלב בקוד שאנו כותבים פקודות אשר ישפיעו על אופן פעולתו של המהדר ובין היתר יוכלו להורות לו להימנע מהידור קטעי קוד מסוימים. פקודות אלה מאופיינות בסימן # אשר מופיע בתחילתן. כך למשל, באמצעות הפקודה #define ניתן להורות על הגדרתו של קבוע ובאמצעות הפקודה #if ניתן לבדוק אם קבוע בשם מסוים כבר הוגדר. בדרך זו ניתן בתהליך הפיתוח לשלב בתחילת הקוד את הגדרתו של קבוע מסוים ובאמצעות הפקודה #if להורות על הידורם של קטעי קוד מסוימים רק בתנאי שהקבוע המסוים אכן הוגדר. בדרך זו, קטעי הקוד האמורים יעברו הידור ויכללו בתוצאה הסופית רק אם הקבוע האמור אכן הוגדר. כאשר נסיים את תהליך הפיתוח נוכל לתחם את הפקודה #define כהערה ובכך לגרום למהדר להימנע מהידור קטעי הקוד האמורים. הדוגמה הבאה מציגה את אופן השימוש בפקודות #define ו- if #. #define DBG using System; namespace Com.Abelski.Samples class Program static void Main(string[] args) int sum = 0; for(int i=0; i<10; i++) sum+=i; #if DBG Console.WriteLine("i="+i); #endif Console.WriteLine("sum="+sum);
18 הפלט שנקבל כאשר DBG מוגדר הוא: הפלט שנקבל כאשר נסמן את שורת ההגדרה של הקבוע DBG הוא: