مقدمة إلى لغة C#
C# (تُنطق "C sharp") هي لغة برمجة حديثة للأغراض العامة تم تطويرها بواسطة Microsoft. يتم استخدامه على نطاق واسع لبناء أنواع مختلفة من التطبيقات، بما في ذلك تطبيقات سطح المكتب والويب والجوال وتطبيقات الألعاب. في هذا الدليل، سنغطي أساسيات برمجة C#، بما في ذلك أنواع البيانات والمتغيرات وتدفق التحكم والوظائف والفئات ومساحات الأسماء والمزيد.
علاوة على ذلك، توفر لغة #C مجموعة غنية من الميزات والأدوات، مما يجعلها لغة برمجة متعددة الاستخدامات وقوية لمختلف المجالات، بما في ذلك تطبيقات سطح المكتب وتطوير الويب وتطبيقات الهاتف المحمول وتطوير الألعاب باستخدام تقنيات مثل Unity. أثناء تقدمك في رحلة C#، يمكنك استكشاف المزيد من الموضوعات المتقدمة مثل الوراثة وتعدد الأشكال والواجهات والأدوية العامة وLINQ (الاستعلام المتكامل للغة) والبرمجة غير المتزامنة باستخدام المهام وغير المتزامن/الانتظار. سيؤدي فهم هذه المفاهيم إلى تعزيز قدرتك على تصميم تطبيقات قوية وقابلة للتطوير.
هيا لنبدأ مع الأساسيات.
تهيئة بيئة التطوير
لبدء البرمجة بلغة C#، ستحتاج إلى إعداد بيئة التطوير الخاصة بك. فيما يلي الخطوات للبدء:
- تثبيت Visual Studio: قم بتنزيل Visual Studio وتثبيته من موقع Microsoft الرسمي على الويب. يعد Visual Studio بيئة تطوير متكاملة (IDE) قوية توفر جميع الأدوات اللازمة لتطوير C#.
- إنشاء مشروع جديد: قم بتشغيل Visual Studio وقم بإنشاء مشروع جديد. اختر قالب المشروع المناسب بناءً على نوع التطبيق الذي ترغب في إنشائه.
- كتابة الكود: بمجرد إعداد مشروعك، يمكنك البدء في كتابة كود C# في محرر التعليمات البرمجية الذي يوفره Visual Studio.
الآن بعد أن قمت بإعداد بيئة التطوير الخاصة بك، دعنا نتعمق في أساسيات برمجة C#.
برنامج مرحبا بالعالم
التقليدية "مرحبا بالعالم!" غالبًا ما يكون البرنامج هو أول برنامج تكتبه بأي لغة برمجة. إليك كيفية كتابتها في C#:
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
}
}
في مثال التعليمات البرمجية هذا، قمنا أولاً بتضمين مساحة الاسم 'System'، والتي تحتوي على فئة تسمى 'Console'، للتعامل مع الإدخال والإخراج. ثم نحدد فئة تسمى 'Program'. داخل هذا الفصل، لدينا طريقة 'Main'، وهي نقطة الدخول لبرنامج C#. أخيرًا، نستخدم الطريقة 'Console.WriteLine' لطباعة عبارة "Hello, World!" رسالة إلى وحدة التحكم.
المتغيرات وأنواع البيانات
في لغة C#، عليك الإعلان عن variables قبل أن تتمكن من استخدامها. تحتوي المتغيرات على قيم لأنواع البيانات المختلفة. فيما يلي بعض أنواع البيانات شائعة الاستخدام في C#:
- 'int': يمثل الأعداد الصحيحة (على سبيل المثال، 10، -5، 0).
- 'double': يمثل أرقام الفاصلة العائمة بمنازل عشرية (على سبيل المثال، 3.14، -0.5).
- 'bool': يمثل القيم المنطقية (صواب أو خطأ).
- 'string': يمثل سلسلة من الأحرف (على سبيل المثال، "Hello"، "C#").
فيما يلي مثال يوضح تعريف المتغير والعمليات الأساسية:
int age = 25;
double pi = 3.14;
bool isStudent = true;
string name = "John";
int sum = age + 5;
double circleArea = pi * 2 * 2;
bool isAdult = age >= 18;
Console.WriteLine("Name: " + name);
Console.WriteLine("Age: " + age);
Console.WriteLine("Sum: " + sum);
Console.WriteLine("Circle Area: " + circleArea);
Console.WriteLine("Is Adult? " + isAdult);
في هذا المثال، نعلن عن المتغيرات 'age'، 'pi'، 'isStudent'، و 'name' مع كل منها أنواع البيانات. نقوم ببعض العمليات الأساسية مثل الجمع والضرب والمقارنة. يتم استخدام الأسلوب 'Console.WriteLine' لعرض القيم على وحدة التحكم.
المصفوفات والمجموعات
المصفوفات والمجموعات هي هياكل بيانات أساسية في لغة C# تسمح لك بتخزين قيم متعددة ومعالجتها بكفاءة. إنها تلعب دورًا حاسمًا في سيناريوهات البرمجة المختلفة وتستخدم على نطاق واسع في تطوير C#.
المصفوفات
المصفوفة في لغة C# عبارة عن مجموعة ذات حجم ثابت من العناصر من نفس النوع. هنا مثال:
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
في هذا المثال، نعلن عن مصفوفة أعداد صحيحة تسمى 'numbers' بحجم '5'. نقوم بتهيئة المصفوفة بالقيم المحددة باستخدام الأقواس المتعرجة '{}'. يمكنك الوصول إلى العناصر الفردية للمصفوفة باستخدام تدوين الفهرس، بدءًا من 0. على سبيل المثال، 'numbers[0]' يمنحك العنصر الأول.
المجموعات
توفر المجموعات في C# مرونة أكبر من المصفوفات حيث يمكنها النمو أو التقلص ديناميكيًا. تقدم لغة #C أنواعًا مختلفة من المجموعات، مثل 'List<T>' و 'Dictionary<TKey, TValue>' و 'HashSet<T>'.
يمكنك إنشاء مجموعة عامة باستخدام إحدى الفئات الموجودة في مساحة الاسم 'System.Collections.Generic'. تكون المجموعة العامة مفيدة عندما يكون لكل عنصر في المجموعة نفس نوع البيانات. تفرض المجموعة العامة كتابة قوية من خلال السماح بإضافة نوع البيانات المطلوب فقط.
using System.Collections.Generic;
فيما يلي مثال باستخدام المجموعة 'List<T>':
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
names.Add("Charlie");
في هذا المثال، قمنا بإنشاء قائمة من السلاسل المسماة 'names' باستخدام فئة المُهيئ 'List<T>'. نستخدم الطريقة 'Add()' لإضافة عناصر إلى القائمة.
يوفر 'List<T>' العديد من الأساليب والخصائص المفيدة للعمل مع المجموعات، مثل 'Count' للحصول على عدد العناصر، 'Remove()' لإزالتها عنصر، و 'Contains()' للتحقق من وجود العنصر.
التكرار على المصفوفات والمجموعات
يمكنك التكرار على المصفوفات والمجموعات باستخدام الحلقات، مثل 'for' أو 'foreach'، للوصول إلى عناصرها ومعالجتها. فيما يلي مثال للتكرار عبر مصفوفة وقائمة:
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
foreach (string name in names)
{
Console.WriteLine(name);
}
في هذا المثال، نستخدم حلقة 'foreach' للتكرار على كل عنصر في المصفوفة 'numbers' والقائمة 'names' وطباعتها إلى وحدة التحكم.
التحكم في التدفق
يتيح لك التحكم في التدفق اتخاذ القرارات وتنفيذ مجموعات مختلفة من التعليمات البرمجية بناءً على الشروط. توفر لغة #C العديد من هياكل التحكم في التدفق، بما في ذلك عبارات 'if'، وعبارات 'switch'، والحلقات.
'If'
تسمح لك عبارة 'if' بتنفيذ مجموعة من التعليمات البرمجية فقط إذا كان الشرط المحدد صحيحًا. هنا مثال:
int number = 10;
if (number > 0)
{
Console.WriteLine("The number is positive.");
}
else if (number < 0)
{
Console.WriteLine("The number is negative.");
}
else
{
Console.WriteLine("The number is zero.");
}
في هذا المثال، نتحقق من قيمة المتغير 'number' باستخدام العبارات 'if'، 'else if'، و 'else'. اعتمادا على الحالة، سيتم طباعة الرسالة المناسبة.
'Switch'
تسمح لك عبارة 'switch' بتحديد إحدى كتل التعليمات البرمجية العديدة التي سيتم تنفيذها بناءً على قيمة التعبير. هنا مثال:
int dayOfWeek = 2;
string dayName;
switch (dayOfWeek)
{
case 1:
dayName = "Monday";
break;
case 2:
dayName = "Tuesday";
break;
case 3:
dayName = "Wednesday";
break;
// ...
default:
dayName = "Invalid day";
break;
}
Console.WriteLine("Today is " + dayName + ".");
في هذا المثال، قمنا بتعيين اسم اليوم بناءً على قيمة 'dayOfWeek' باستخدام العبارة 'switch'. تحدد عبارات 'case' القيم المحتملة ويتم تنفيذ الحالة 'default' إذا لم تتطابق أي من الحالات.
بيانات الحلقة
تسمح لك الحلقات بتنفيذ مجموعة من التعليمات البرمجية بشكل متكرر حتى يتم استيفاء شرط معين. يوفر C# حلقات 'for' و'while' و'do-while'.
'For'
يتم استخدام حلقة 'for' عندما تعرف عدد التكرارات مسبقًا. هنا مثال:
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Iteration: " + i);
}
في هذا المثال، يتم تشغيل الحلقة خمس مرات، مع طباعة رقم التكرار في كل مرة.
'While'
يتم استخدام حلقة 'while' عندما لا تعرف عدد التكرارات مسبقًا، ولكن لديك شرطًا يجب التحقق منه. هنا مثال:
int count = 0;
while (count < 5)
{
Console.WriteLine("Count: " + count);
count++;
}
في هذا المثال، يتم تشغيل الحلقة حتى يصل المتغير 'count' إلى 5.
'Do-While'
تشبه حلقة 'do-while' حلقة while، ولكن يتم التحقق من الشرط في النهاية، لذلك يتم تنفيذ الحلقة مرة واحدة على الأقل. هنا مثال:
int num = 1;
do
{
Console.WriteLine("Number: " + num);
num++;
} while (num <= 5);
في هذا المثال، يتم تشغيل الحلقة حتى لا يصبح المتغير 'num' أقل من أو يساوي 5.
المهام
تسمح لك الوظائف بتغليف كتل التعليمات البرمجية القابلة لإعادة الاستخدام. تدعم لغة #C تعريف الوظائف باستخدام الكلمة الأساسية 'void' للطرق التي لا تُرجع قيمة وأنواع البيانات الأخرى للطرق التي تُرجع قيمة. هنا مثال:
int Add(int a, int b)
{
return a + b;
}
void Greet(string name)
{
Console.WriteLine("Hello, " + name + "!");
}
int result = Add(5, 3);
Greet("Alice");
في هذا المثال، قمنا بتعريف وظيفتين: 'Add' و 'Greet'. تأخذ الدالة 'Add' معلمتين صحيحتين وترجع مجموعهما. تأخذ الدالة 'Greet' معلمة سلسلة وتطبع رسالة ترحيب. ثم نسمي هذه الوظائف بالوسائط المناسبة.
الفئات والكائنات
C# هي لغة برمجة موجهة للكائنات، مما يعني أنها تدعم إنشاء classes والكائنات. تحدد الفئات مخططًا لإنشاء الكائنات، وهي مثيلات لتلك الفئات. هنا مثال:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void SayHello()
{
Console.WriteLine("Hello, my name is " + Name + " and I'm " + Age + " years old.");
}
}
Person person = new Person();
person.Name = "John";
person.Age = 30;
person.SayHello();
في هذا المثال، نحدد فئة 'Person' بخصائص 'Name' و 'Age' وطريقة 'SayHello'. نقوم بعد ذلك بإنشاء مثيل للفئة 'Person' باستخدام الكلمة الأساسية 'new' وتعيين خصائصها. أخيرًا، نستدعي الطريقة 'SayHello' على الكائن 'person'.
مفاهيم البرمجة الشيئية (OOP).
C# هي لغة برمجة موجهة للكائنات، وتوفر ميزات متنوعة لدعم مفاهيم OOP مثل الميراث، والتغليف، وتعدد الأشكال.
ميراث
يسمح لك الميراث بإنشاء فئات جديدة بناءً على الفئات الموجودة، وراثة سماتها وسلوكياتها. هنا مثال:
class Shape
{
public virtual void Draw()
{
Console.WriteLine("Drawing a shape.");
}
}
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a circle.");
}
}
في هذا المثال، ترث الفئة 'Circle' من الفئة 'Shape' باستخدام الرمز ':'. تتجاوز فئة 'Circle' طريقة 'Draw' من الفئة الأساسية لتوفير التنفيذ الخاص بها.
التغليف
التغليف هو ممارسة تجميع البيانات والأساليب معًا في الفصل والتحكم في الوصول إليها. يمكنك استخدام معدّلات الوصول ('public'، 'private'، 'protected'، وما إلى ذلك) لتحديد إمكانية رؤية الأعضاء. هنا مثال:
class Person
{
private string name;
public string GetName()
{
return name;
}
public void SetName(string newName)
{
name = newName;
}
}
في هذا المثال، يتم تضمين الحقل 'name' داخل الفئة 'Person' ولا يمكن الوصول إليه إلا من خلال 'GetName' و * طرق h81*.
تعدد الأشكال
يسمح تعدد الأشكال بمعاملة الكائنات من فئات مختلفة ككائنات من فئة أساسية مشتركة. يتيح ذلك كتابة التعليمات البرمجية التي تعمل مع أنواع مختلفة من الكائنات بطريقة موحدة. هنا مثال:
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Animal makes a sound.");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Dog barks.");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Cat meows.");
}
}
في هذا المثال، تحتوي الفئة 'Animal' على أسلوب 'MakeSound' ظاهري، والذي يتم تجاوزه بواسطة 'Dog' و 'Cat' فصول دراسية. يتيح لنا تعدد الأشكال التعامل مع مثيلات 'Dog' و 'Cat' كمثيلات لـ 'Animal' واستدعاء 'MakeSound' الطريقة عليهم.
معالجة الاستثناء
تتيح لك معالجة الاستثناءات التعامل مع أخطاء وقت التشغيل بأمان. في لغة C#، يمكنك استخدام الكتل 'try-catch' لالتقاط الاستثناءات ومعالجتها. هنا مثال:
try
{
int result = 10 / 0;
Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Divide by zero error: " + ex.Message);
}
finally
{
Console.WriteLine("Cleanup code goes here.");
}
في هذا المثال، نحاول إجراء القسمة على صفر، مما يؤدي إلى ظهور 'DivideByZeroException'. يتم تنفيذ الكود الموجود داخل الكتلة 'try'، وفي حالة حدوث استثناء، يتم اكتشافه بواسطة الكتلة 'catch'.
يتم تنفيذ الكتلة 'finally' بغض النظر عما إذا كان هناك استثناء أم لا، ويتم استخدامها عادةً لعمليات التنظيف.
تساعد معالجة الاستثناءات على منع تعطل البرنامج وتسمح بمعالجة الأخطاء واستردادها بشكل متحكم فيه.
خاتمة
يقدم هذا الدليل الشامل مقدمة تفصيلية لبرمجة C#، ويغطي الأساسيات والمفاهيم الأساسية للغة. البدء بإعداد بيئة التطوير وكتابة "Hello, World!" في البرنامج، قمنا باستكشاف أنواع البيانات والمتغيرات وهياكل تدفق التحكم مثل عبارات if والحلقات وإنشاء الوظائف. لقد بحثنا في موضوعات أكثر تقدمًا مثل الفئات والكائنات والميراث والتغليف وتعدد الأشكال بالإضافة إلى معالجة الاستثناءات. بالإضافة إلى ذلك، ناقشنا استخدام المصفوفات والمجموعات لإدارة قيم متعددة. بفضل هذه المعرفة، أصبح لديك الآن أساس متين في برمجة C#، مما يمكّنك من تطوير مجموعة واسعة من التطبيقات، بدءًا من تطبيقات وحدة التحكم إلى تطبيقات الويب والهاتف المحمول. تذكر أن تستمر في ممارسة واستكشاف النظام البيئي الواسع لـ C# لتعزيز مهاراتك وفتح إمكانيات لا حصر لها.