התוכנית הראשונה הקלאסית מדפיסה שורת טקסט אחת. ב-C# היא נראית כך:
פלט:
Hello, World!
שורה אחרי שורה
using System;מאפשר לכתובConsoleבמקום השם המלאSystem.Console.Consoleהיא מחלקה ב-namespaceSystem(ראו namespaces ו-using).class Programמצהיר על מחלקה. כל קוד C# נמצא בתוך טיפוס; השםProgramהוא מוסכמה, לא דרישה.static void Main()היא נקודת הכניסה. כשהתוכנית מתחילה, סביבת הריצה מחפשת מתודה סטטית בשםMainוקוראת לה.staticאומר שהיא שייכת למחלקה עצמה, כך שלא צריך ליצור קודם אובייקט.voidאומר שהיא לא מחזירה כלום.Console.WriteLine("Hello, World!");קורא למתודהWriteLineעם ארגומנט מחרוזת. כל פקודה מסתיימת בנקודה-פסיק.- הסוגריים המסולסלים
{ }מסמנים את הגוף של המחלקה ושל המתודה.
C# רגישה לאותיות גדולות וקטנות. console.writeline ו-main הם שמות שונים מ-Console.WriteLine ומ-Main, ואף אחד מהם לא קיים.
Console.WriteLine מול Console.Write
WriteLine מוסיפה ירידת שורה אחרי הטקסט. Write לא, ולכן הפלט הבא ממשיך באותה שורה. שתיהן מקבלות כל טיפוס, לא רק מחרוזות: מספרים, בוליאנים ואובייקטים מומרים בעזרת המתודה ToString() שלהם.
פלט:
Loading.. done
42
True
Item: coffee
coffee costs 3.20
coffee costs 3.20
שימו לב ש-true מודפס כ-True: זה מה ש-bool.ToString() מחזירה. הצורה $"...", שנקראת string interpolation, היא זו שתשתמשו בה הכי הרבה; ראו string interpolation לקודי העיצוב כמו :F2.
קריאת קלט עם Console.ReadLine
Console.ReadLine() מחכה שהמשתמש יקליד שורה וילחץ Enter, ואז מחזירה את השורה הזו כ-string בלי ירידת השורה. בסוף הקלט (למשל כשהקלט מנותב מקובץ שנגמר) היא מחזירה null.
פלט:
What is your name? How old are you?
Hi Maya, next year you will be 28.
כשמריצים את זה בטרמינל, הטקסט שמקלידים מופיע אחרי כל הנחיה. בפלט שלמעלה אין טקסט מוקלד כי הקלט נותב (הוזרם דרך pipe) ולא הוקלד, ולכן מופיע רק מה שהתוכנית עצמה כותבת.
ReadLine תמיד מחזירה טקסט. כדי להשתמש בערך כמספר צריך להמיר אותו. int.Parse(text) זורקת FormatException כשהטקסט הוא לא מספר; int.TryParse מחזירה במקום זאת false, ולכן היא הבחירה הנכונה לקלט ממשתמש. הפרטים נמצאים ב-המרת טיפוסים.
שתי מתודות קשורות: Console.Read() מחזירה את התו הבא כקוד int, ו-Console.ReadKey() קוראת לחיצת מקש אחת בלי לחכות ל-Enter (היא עובדת רק בטרמינל אינטראקטיבי).
הצורות האחרות של המתודה Main
Main יכולה לקבל את הארגומנטים של שורת הפקודה ויכולה להחזיר קוד יציאה. כל אלה נקודות כניסה תקינות:
static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)
static async Task Main() // C# 7.1 and later
static async Task<int> Main(string[] args) // C# 7.1 and later
int שמוחזר הופך לקוד היציאה של התהליך, שסקריפטים ומערכות CI קוראים כדי להחליט אם התוכנית הצליחה (0 פירושו הצלחה לפי המוסכמה).
פלט:
Got 0 argument(s)
הריצו את זה עם dotnet run -- apples pears ו-args יחזיק את "apples" ואת "pears". ה--- מפריד בין ארגומנטים לתוכנית שלכם לבין ארגומנטים לכלי dotnet.
הערות
ב-C# יש שלושה סוגי הערות. הקומפיילר מתעלם מכולם.
// A single-line comment runs to the end of the line.
/* A block comment
can span several lines. */
/// <summary>
/// An XML documentation comment. Editors show it as the tooltip for the method.
/// </summary>
static decimal ApplyDiscount(decimal price) => price * 0.9m;
השתמשו ב-// להערות בתוך הקוד. הערות /// נכתבות על טיפוסים ועל איברים ציבוריים; סביבת הפיתוח מציגה אותן כשמרחפים מעל קריאה, והקומפיילר יכול לייצא אותן לקובץ XML עבור כלי תיעוד.
יצירה והרצה של פרויקט עם dotnet
במחשב שלכם, התקינו את ה-.NET SDK מ-dotnet.microsoft.com, ואז:
dotnet new console -o HelloApp
cd HelloApp
dotnet run
Hello, World!
dotnet new console יוצר שני קבצים: HelloApp.csproj (קובץ הפרויקט: framework יעד, הגדרות, הפניות לחבילות) ו-Program.cs. dotnet run מקמפל את הפרויקט ומריץ אותו. dotnet build מקמפל בלי להריץ וכותב את הפלט ל-bin/Debug/net8.0/ (שם התיקייה תלוי ב-framework היעד שלכם).
Top-level statements (C# 9 ואילך)
פתחו את Program.cs שנוצר ותמצאו בו את זה, ושום דבר אחר:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
זו תוכנית עם top-level statements, יכולת של C# 9. הקומפיילר מייצר את המחלקה Program ואת המתודה Main סביב הפקודות שלכם. גם using System; חסר, כי פרויקטים של .NET 6 ואילך מפעילים implicit usings: namespaces נפוצים כמו System, System.IO, System.Linq ו-System.Collections.Generic מיובאים לכל הפרויקט.
תוכניות top-level עדיין יכולות לקרוא את args, להשתמש ב-await ולבצע return של קוד יציאה:
// C# 9 and later: the whole Program.cs
Console.Write("Name: ");
string? name = Console.ReadLine();
Console.WriteLine($"Hello, {name}! You passed {args.Length} arguments.");
return 0;
רק קובץ אחד בפרויקט יכול להכיל top-level statements, וטיפוסים (מחלקות, records) חייבים לבוא אחריהם. ההערה string? היא nullable reference type (C# 8), והיא שם כי ReadLine יכולה להחזיר null. הצורה המפורשת עם class Program שמשמשת בדוגמאות בעמוד הזה שקולה, והיא מה שתראו בקוד ישן יותר וברוב הסקריפטים של Unity, ולכן כדאי לדעת לקרוא את שתיהן. העבירו --use-program-main ל-dotnet new console אם אתם מעדיפים את הצורה המפורשת בפרויקטים חדשים.
השגיאות שתראו ראשונות
- CS1002: ; expected. לפקודה חסרה נקודה-פסיק. השגיאה מדווחת בסוף השורה שחסרה לה.
- CS0103: The name 'console' does not exist in the current context. אותיות גדולות וקטנות שגויות, או
using System;חסר בפרויקט בלי implicit usings. - CS5001: Program does not contain a static 'Main' method suitable for an entry point.
Mainמאוית לא נכון, לאstatic, או שיש לה חתימה שאינה נתמכת. - CS0017: Program has more than one entry point defined. בשתי מחלקות יש
Main. השאירו אחת, או בחרו אחת עם ההגדרהStartupObjectבקובץ ה-.csproj. - החלון נסגר מיד. כשמפעילים אפליקציית console בלחיצה כפולה, החלון נסגר כש-
Mainחוזרת. הריצו אותה מטרמינל, או הוסיפוConsole.ReadKey();בסוף בזמן הבדיקות.
שאלות נפוצות
איך כותבים Hello World ב-C#?
כתבו Console.WriteLine("Hello, World!"); בתוך מתודה static void Main() של מחלקה, עם using System; בראש הקובץ. בפרויקט שנוצר עם dotnet new console ב-.NET 6 ואילך, כל הקובץ יכול להיות רק השורה הזו, כי top-level statements מייצרים בשבילכם את המחלקה ואת Main.
מה זו המתודה Main ב-C#?
Main היא נקודת הכניסה: המתודה שסביבת הריצה קוראת לה כשהתוכנית מתחילה. היא חייבת להיות static, יכולה להחזיר void או int (קוד היציאה), ויכולה לקבל פרמטר string[] args עם הארגומנטים של שורת הפקודה. לתוכנית צריכה להיות בדיוק אחת.
מה ההבדל בין Console.Write ל-Console.WriteLine?
Console.WriteLine כותבת את הטקסט ואחריו ירידת שורה, כך שהפלט הבא מתחיל בשורה חדשה. Console.Write כותבת רק את הטקסט, כך שהפלט הבא ממשיך באותה שורה. Console.WriteLine() בלי ארגומנטים מדפיסה שורה ריקה.
איך קוראים קלט מהמשתמש ב-C#?
Console.ReadLine() קוראת שורת טקסט אחת ומחזירה אותה כ-string (בלי ירידת השורה), או null כשאין עוד קלט. כדי לקבל מספר, המירו את המחרוזת: int.TryParse(Console.ReadLine(), out int n) מחזירה false במקום לקרוס כשהטקסט הוא לא מספר.
איך מריצים תוכנית C# משורת הפקודה?
התקינו את ה-.NET SDK, ואז הריצו dotnet new console -o HelloApp כדי ליצור פרויקט, cd HelloApp, ו-dotnet run כדי לבנות ולהריץ אותו. dotnet build רק מקמפל, ושם את הפלט ב-bin/Debug/net8.0/ (או בגרסה שאליה אתם מכוונים).