תכנות חזותי.
השפה תומכת בתכנות חזותי בעיקר בממשקי משתמש, באמצעות ספריות תקניות של הדוט נט וכלי פיתוח של הסטודיו, כאשר אלמנטים בשפה כאירועים ומאפיינים משתלבים בפיתוח החזותי ומקלים עליו. ניתן ליצור טפסים (Form) ליישומים שולחניים באמצעות ה-WinForms, דפים (Page) ליישומי אינטרנט באמצעות ה-WebApplication, חלונות (Window) ליישומי גרפיקה מתקדמים באמצעות מודל התכנות WPF, ומסכים (Screen) ביישומי משחקים.
העיקרון שנלקח מוויז'ואל בייסיק, הורחב והועצם, הוא יצירת אובייקט ראשי המסמל טופס, דף או חלון בהתאם לסוג היישום, שיכול להכיל בתוכו פקדים שהם מודלים תכנותיים קטנים, המיוצגים באמצעות צלמיות, שיכולים לתקשר זה עם זה. על גבי הטופס ניתן ל"צייר" ולמקם פקדים באמצעות גרירתם מחלונית "ארגז כלים" (ToolBox), וניתן לראות את צורת הסידור שלהם באמצעות חלונית "מתאר מסמך" (Document outline/Designer). ישנה חלוקה פנימית בין פקדים (Controls) (שהם רכיבי תוכנה חזותיים כמו פקד תיבת טקסט ופקד תמונה) לבין רכיבים (Components) (שהם רכיבי תוכנה לוגיים, למשל רכיב FileSystemWatcher שעוקב אחר שינויים בקבצים, או רכיב BackgroundWorker שמאפשר ליצור תהליכון נפרד עם אירועים). הקשר בין פעולות הממשק לקוד הוא דו כיווני: לכל פעולה חזותית מחולל קוד מתאים, למשל גרירה של פקד אל הטופס יוצרת הכרזה שלו בטופס ואתחול של מאפיינים מסוימים שנקבעו מראש, כמיקום הפקד בטופס, וגודלו, וכל שינוי בקוד מתורגם לייצוגים החזותיים בחזרה.
ב-WebApplication קיימים כ-90 פקדים ורכיבים שונים, וב-WinForms קיימים כ-70 פקדים ורכיבים שונים. ניתן ליצור פקדי ורכיבי משתמש מותאמים אישית על בסיס פקדים ורכיבים קיימים, או פקדים ורכיבים חדשים. הפקדים מסווגים בדרך כלל לכמה קטגוריות עיקריות. ב-WinForms למשל הם מסווגים לשיתופיים, מכולות (פקדים שמכילים פקדים אחרים), תפריטים, נתונים (לעבודה עם בסיסי נתונים), תיבות שיח ועוד. דרך העבודה האופיינית היא גישה אל הקוד מתוך הממשק והליכה מהכלל אל הפרט. תחילה יש ליצור את הטופס, לשרטט עליו את הפקדים, ולאחר מכן להגדיר את מאפייניהם השונים, והאירועים הדרושים ליישום באמצעות חלונית "מאפיינים" (Properties) שמציגה את המאפיינים והאירועים הקיימים בפקד, ואז ליצור אירוע באזור הקוד, ולכתוב בו את הקוד הנדרש כדי לממש את התוכנית.
השפה גם תומכת, באמצעות Xamarin.Forms, בתכנות אפליקציות חוצה פלטפורמות עבור טלפונים ניידים ומכשירי Windows (עם פלטפורמת UWP).
זיכרון מנוהל.
במטרה למנוע בעיות הנובעות מניהול עצמאי של זיכרון כמו זליגת זיכרון ודריסת זיכרון, שפת C#, כחלק מטכנולוגיית דוט נט, מוגדרת כ"קוד מנוהל" (Managed Code). המתכנת פטור מן האחריות לשחרור מפורש של זיכרון המוקצה לאובייקט. סביבת ההרצה (CLR - Common Language Runtime) היא המופקדת על שחרור הזיכרון שתופסים עצמים שאינם בשימוש יותר.
לצורך כך, יוזמת סביבת ההרצה אחת לזמן מה תהליך של "איסוף זבל" (Garbage collection), הממפה את כל העצמים במערכת ומסמן למחיקה את אלו שאינם בשימוש. לצורך המיפוי מוגדרים מספר רכיבים ראשיים ("שורשים"). עצם הוא בשימוש אם הוא מוחזק על ידי אחד הרכיבים הראשיים, או שניתן להגיע אליו מאחד הרכיבים הראשיים דרך סדרה של עצמים אחרים. עצמים שאינם בשימוש מסומנים למחיקה. אם הוגדר עליהם קוד הרצה לפני מחיקה (Finalizer) הוא יבוצע. ולאחר מכן העצם ימחק והזיכרון אותו תפס ישוחרר.
זיכרון מנוהל אמור להבטיח ניצול של משאבי הזיכרון, אך הוא אינו מגן על משאבים אחרים כדוגמת גישה לבסיסי מידע, קבצים פתוחים וכדומה. בנוסף, זליגת זיכרון עדיין עלולה לקרות אם כתוצאה משגיאה בתוכנית ניתן לגשת אל עצמים גם כאשר אין בהם עוד צורך. מנגנון איסוף הזבל לא יכול לדעת שמדובר בשגיאה, ולא יפנה את העצמים מן הזיכרון.
טיפול בחריגות.
C# תומכת בטיפול בחריגות (מנגנון בקרת זרימה המיועד לציין ולטפל במצבים לא תקינים במהלך הריצה של התוכנית) על ידי "זריקת" אובייקטים במעלה שרשרת הקריאות לפונקציה, כדי להעביר מידע על החריגה. אפשר לזרוק רק אובייקטים ממחלקות היורשות מהמחלקה Exception. אין דרך להצהיר על החריגות הנזרקות ממתודה, חריגה שנזרקת ולא נתפסת תפעפע עד סביבת הריצה עצמה.
באופן דומה לשפות אחרות, הטיפול בחריגות נעשה על ידי השימוש ב-try-catch-finally, כאשר ניתן לספק טיפוס מסוים ל-catch ולקבל מידע אודות השגיאה:
throw new ExceptionType("Message"); // throw new exception
catch (ExceptionType e)
// Here exception can be handeled
finally
// this will be called anyway
תאימות לאחור.
כדי להקל על מפתחים להגר משפות אחרות, ובפרט משפת C++, אל שפת C#, נכללו בשפה "כינויים" למספר מחלקות ומבנים, הזהים לשמות המקבילים בשפת C++:
בנוסף, קיימים כינויים למחלקות שאינן קיימות כסוגי משתנים בשפת C++: הכינוי object למחלקה Object, וכן הקידומת unsigned משפת C++ תהיה בדרך כלל הקידומת u לכינוי המתאים (למעט byte, שהוא כבר unsigned, ולכן קיים הכינוי sbyte, שהוא byte עם סימן). למשל, unsigned int בשפת C++ מקביל ל-uint בשפת C#, שאינו אלא כינוי למבנה UInt32.
המבנה Char בשפת C# מכיל נתון באורך 16 סיביות או יותר (קידוד UTF-16), כדי שיוכל להכיל תו יוניקוד, בניגוד ל-char של C++ שהוא על פי רוב באורך 8 סיביות (מתאים להכיל תו ASCII, או בית בודד).
ניתן להשתמש בכינוי של מחלקה או בשם המפורש שלה, ללא כל משמעות מבחינת ריצת התוכנית.
גרסאות.
ל-C# פורסמו מספר מהדורות, בדרך כלל בצמוד להפצת מהדורה חדשה של ויז'ואל סטודיו:
דוגמה לתוכנית Hello world.
להלן דוגמה לתוכנית Hello world בשפה זו:
using System;
public class ExampleClass
public static void Main(string[] args)
Console.WriteLine("Hello world!");
מלחמת עיראק
מלחמת עיראק או מלחמת המפרץ השנייה (השם הרשמי בצבא ארצות הברית הוא מבצע חופש לעיראק, באנגלית: Operation Iraqi Freedom) הייתה פלישה של חילות קואליציה של מדינות בראשות ארצות הברית בהנהגת הנשיא ג'ורג' ווקר בוש ובריטניה בראשות ראש הממשלה טוני בלייר לעיראק (ביחד עם ממשלות אוסטרליה ופולין), החל מ-20 במרץ 2003, במטרה להפיל את משטרו של סדאם חוסיין. בכמה מובנים, היה זה המשכה של מלחמת המפרץ שהתרחשה ב-1991. עיקר הלחימה נמשך שלושה שבועות, במהלכה נכבשה עיראק והופל משטרו של חוסיין, שנתפס מאוחר יותר, הועמד לדין והוצא להורג ב-2006. לאחר המלחמה נותרו כוחות הקואליציה בעיראק ונאבקו בכוחות גרילה מקומיים, במאבק שנמשך עד 15 בדצמבר 2011, עת הכריזה ארצות הברית רשמית על סיום מעורבותה הצבאית בעיראק. בתשע שנות לחימה אלה, נמנו כ-4,800 הרוגים לכוחות הקואליציה, רובם אמריקאים, ולמעלה מ-100,000 הרוגים עיראקים.
לאחר הפלישה לעיראק התקיימו בה בחירות בהשתתפות מספר מפלגות בשנת 2005. נורי אל-מאלכי הפך לראש הממשלה בשנת 2006 וכיהן בתפקיד זה עד שנת 2014. ממשלתו של מאלכי קדמה מדיניות שנתפסה כמקדמת עוינות בקרב המיעוט הסוני במדינה ומחריפה מתחים בין זרמים באסלאם. מאות אלפי פליטים עיראקים זרמו למדינות שכנות, חלקם עברו לסוריה והחריפו בה בעיות של אבטלה ודיור, דבר שהיה בין הגורמים לפרוץ המהומות בסוריה בשנת 2011 שהובילו לפרוץ מלחמת האזרחים בסוריה. בשנת 2014, פתח ארגון הטרור הסוני המדינה האסלאמית במתקפה צבאית נרחבת בצפון עיראק והכריז על חליפות עולמית איסלמית, דבר שגרר מלחמה נוספת בהשתתפות המדינה האסלאמית מול כוחות של ארצות הברית, הכורדים, טורקיה, ירדן, סוריה ורוסיה.
ההכנות למלחמה.
העילה הרשמית למלחמה הייתה טענה בדבר הימצאות של נשק להשמדה המונית בידי משטרו של סדאם חוסיין העלול לסכן את מדינות האזור ושלום העולם. ראיות לכאורה לטענה זו הוצגו על ידי ממשלת ארצות הברית, בתיאום עם סוכנות הביון המרכזית. עם זאת, לאחר כ-7 שנים, ויותר מרבע מליון חיילים שסרקו וכבשו את המדינה, טרם נמצאה הוכחה לקיומו של נשק להשמדה המונית בעיראק, והחיפושים אחר נשק כזה הופסקו.
טענה נוספת הייתה כי למשטר סדאם חוסיין היו קשרים עם ארגון אל-קאעידה, אולם הטענה התבססה על שהות של ארגון טרור שנמצא דווקא בחלק הצפוני של עיראק שהיה נתון בידי שלטון אוטונומי של הכורדים.
לפני המלחמה ובמהלכה היו חיכוכים רבים בין האמריקנים והבריטים לעמיתיהם באירופה ובקרב ארצות העולם האחרות. חילוקי דעות אלו התבטאו בסירובן של צרפת סין ורוסיה להצביע בעד החלטה במועצת הביטחון של האו"ם, שתאשר לארצות הברית לעשות שימוש בכוח כדי לאלץ את סדאם לציית להחלטות מועצת הביטחון הקודמות. לאחר שארצות הברית לא הצליחה לגייס את הרוב הדרוש ונחלה כישלון גם במושב העצרת של האומות המאוחדות, החליטו האמריקנים והבריטים לחבור יחדיו ולתקוף במשולב את עיראק, בעזרת מספר מדינות נוספות, ללא קבלת אישור בינלאומי.
בעת ההכנות למלחמה כינה גנרל דייוויד מקירנן, מפקד כוחות המתקפה הקרקעית של צבא ארצות הברית וכוחות הקואליציה, את מבצע כיבוש עיראק בשם קוברה 2 לזכר מתקפתו של גנרל ג'ורג' פטון בצרפת במלחמת העולם השנייה.
מהלך המלחמה.
ריכוז הכוחות במדינות השכנות נמשך מספר חודשים וב-20 במרץ 2003 ניתן האות למלחמה. חילות האוויר של כוחות הברית החלו לפגוע במתקנים ממשלתיים וצבאיים בבגדאד וברחבי עיראק כולה, ואף ניסו לפגוע באופן אישי בסדאם חוסיין, בבני משפחתו ובעוזריו הקרובים. כוחות הקואליציה קיבלו סיוע מודיעיני, לוגיסטי וצבאי מכוחות הפשמרגה, המיליציות הכורדיות בצפון עיראק.