أول برنامج تقليدي يطبع سطرًا واحدًا من النص. في C# يبدو هكذا:
المخرجات:
Hello, World!
سطرًا سطرًا
- يتيح لك
using System;كتابةConsoleبدل الاسم الكاملSystem.Console. وConsoleصنف في فضاء الأسماءSystem(راجع فضاءات الأسماء و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(). الصيغة $"..."، واسمها استيفاء النصوص، هي التي ستستخدمها أكثر من غيرها؛ راجع استيفاء النصوص لرموز التنسيق مثل :F2.
قراءة المدخلات بـ Console.ReadLine
تنتظر Console.ReadLine() أن يكتب المستخدم سطرًا ويضغط Enter، ثم تعيد ذلك السطر كـ string دون محرف السطر الجديد. وعند نهاية المدخلات (مثلًا حين تُعاد توجيه المدخلات من ملف انتهى) تعيد null.
المخرجات:
What is your name? How old are you?
Hi Maya, next year you will be 28.
حين تشغّل هذا في طرفية يظهر النص الذي تكتبه بعد كل سؤال. لا يحتوي الإخراج أعلاه على نص مكتوب لأن المدخلات أُعيد توجيهها (مُرّرت بأنبوب) بدل كتابتها، فلا يظهر إلا ما يكتبه البرنامج نفسه.
تعيد 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 (ملف المشروع: إطار العمل المستهدف والإعدادات ومراجع الحزم) وProgram.cs. يترجم dotnet run المشروع ويشغّله. ويترجم dotnet build دون تشغيل ويكتب الناتج في bin/Debug/net8.0/ (يتبع اسم المجلد إطار العمل المستهدف).
العبارات عالية المستوى (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 وما بعدها تفعّل موجّهات using الضمنية: تُستورد فضاءات الأسماء الشائعة مثل System وSystem.IO وSystem.Linq وSystem.Collections.Generic للمشروع كله.
ما زال بإمكان البرامج عالية المستوى قراءة 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;
لا يمكن إلا لملف واحد في المشروع أن يحتوي على عبارات عالية المستوى، ويجب أن تأتي الأنواع (الأصناف والسجلات) بعدها. الوسم string? نوع مرجع قابل لـ null (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;في مشروع بلا موجّهات using ضمنية. - 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. - النافذة تُغلق فورًا. حين يبدأ تطبيق كونسول بنقرة مزدوجة تُغلق النافذة عند عودة
Main. شغّله من طرفية، أو أضفConsole.ReadKey();في النهاية أثناء الاختبار.
الأسئلة الشائعة
كيف تكتب Hello World في C#؟
ضع Console.WriteLine("Hello, World!"); داخل دالة static void Main() في صنف، مع using System; في أعلى الملف. في مشروع أنشأه dotnet new console على .NET 6 أو أحدث يمكن أن يكون الملف كله هذا السطر وحده، لأن العبارات عالية المستوى تولّد الصنف و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/ (أو الإصدار الذي تستهدفه).