C#: السلاسل

1. الإعلان والتهيئة

string هو اسم مستعار لـ System.String، وهو نوع مرجعي غير قابل للتغيير. وبمجرد إنشاء السلسلة، لا يمكن تغيير محتواها.

▶ مثال

CSHARP
string name = "Hello";
string empty = "";
string nullStr = null;
string fromChar = new string('A', 5);
Console.WriteLine(name);
Console.WriteLine(fromChar);
▶ جرّب الكود
TEXT 📖 للعرض فقط
Hello
AAAAA

2. ثبات السلاسل

بمجرد إنشاء كائن سلسلة، لا يمكن تعديل تسلسل أحرفه. فجميع عمليات «التعديل» تُرجع سلسلة جديدة، تاركة السلسلة الأصلية دون تغيير.

▶ مثال

CSHARP
string a = "Hello";
string b = a;
a = a + " World";
Console.WriteLine(a);
Console.WriteLine(b);
▶ جرّب الكود
TEXT 📖 للعرض فقط
Hello World
Hello

نصيحة: لا يزال b يشير إلى "Hello" الأصلي، بينما يُنشئ a + " World" كائن سلسلة جديدًا تمامًا.


3. ربط السلاسل

استخدم عامل + أو String.Concat() أو String.Join() لدمج عدة سلاسل.

▶ مثال

CSHARP
string s1 = "Hello" + " " + "World";
string s2 = String.Concat("A", "B", "C");
string s3 = String.Join(", ", new string[] { "apple", "banana", "cherry" });
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine(s3);
▶ جرّب الكود
TEXT 📖 للعرض فقط
Hello World
ABC
apple, banana, cherry

4. الاستيفاء في السلاسل

استخدم صيغة الاستيفاء $"" أو String.Format() لتضمين المتغيرات داخل سلسلة نصية.

▶ مثال

CSHARP
string name = "Alice";
int age = 25;
string s1 = $"My name is {name}, age {age}.";
string s2 = String.Format("My name is {0}, age {1}.", name, age);
string s3 = $"2 + 3 = {2 + 3}";
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine(s3);
▶ جرّب الكود
TEXT 📖 للعرض فقط
My name is Alice, age 25.
My name is Alice, age 25.
2 + 3 = 5

نصيحة: يمكنك كتابة أي تعبير بلغة C# داخل أقواس الاستيفاء {}، وإضافة محددات التنسيق مثل {value:F2}.


5. مقارنة السلاسل

يقوم المشغل == بإجراء مقارنة المساواة في القيمة بين السلاسل (وليس مقارنة المراجع). أما المشغلات Equals() وCompare() وCompareOrdinal() فتوفر تحكمًا أكثر دقة.

▶ مثال

CSHARP
string a = "hello";
string b = "hello";
string c = "HELLO";
Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));
Console.WriteLine(String.Compare(a, c, StringComparison.OrdinalIgnoreCase) == 0);
Console.WriteLine(String.CompareOrdinal(a, c) > 0);
▶ جرّب الكود
TEXT 📖 للعرض فقط
True
True
True
True

تحذير: تقوم السلسلة == بمقارنة القيم، وليس المراجع، وهو ما يختلف عن سلوك معظم أنواع المراجع الأخرى.


6. الطرق الشائعة: الطول / السلسلة الفرعية / الاستبدال / التقسيم

هذه هي الطرق الأكثر استخدامًا في العمليات اليومية على سلاسل الأحرف.

▶ مثال

CSHARP
string s = "Hello, World!";
Console.WriteLine(s.Length);
Console.WriteLine(s.Substring(7));
Console.WriteLine(s.Substring(0, 5));
Console.WriteLine(s.Replace("World", "C#"));
string parts = "a,b,c";
foreach (string p in parts.Split(','))
{
    Console.WriteLine(p);
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
13
World!
Hello
Hello, C#!
a
b
c

7. الطرق الشائعة: Trim / Contains / Index

تقوم Trim() بإزالة المسافات البيضاء في بداية ونهاية السلسلة، وتقوم Contains() بالبحث عن سلسلة فرعية، بينما تقوم IndexOf() وLastIndexOf() بتحديد المواقع.

▶ مثال

CSHARP
string s = "  Hello World  ";
Console.WriteLine($"[{s.Trim()}]");
Console.WriteLine(s.Contains("World"));
Console.WriteLine(s.IndexOf("World"));
Console.WriteLine(s.LastIndexOf("o"));
▶ جرّب الكود
TEXT 📖 للعرض فقط
[Hello World]
True
8
7

8. الطرق الشائعة: Case / StartsWith / EndsWith / Pad / Remove / Insert

طرق أكثر عملية لمعالجة السلاسل.

▶ مثال

CSHARP
string s = "Hello";
Console.WriteLine(s.ToUpper());
Console.WriteLine(s.ToLower());
Console.WriteLine(s.StartsWith("Hel"));
Console.WriteLine(s.EndsWith("llo"));
Console.WriteLine("5".PadLeft(3, '0'));
Console.WriteLine("5".PadRight(3, '0'));
string r = "Hello World".Remove(5);
Console.WriteLine(r);
string ins = "H World".Insert(1, "ello");
Console.WriteLine(ins);
▶ جرّب الكود
TEXT 📖 للعرض فقط
HELLO
hello
True
True
005
500
Hello
Hello World

9. السلاسل الحرفية والسلاسل الأولية

لا تعالج السلاسل الحرفية @"" تسلسلات الهروب، مما يجعلها مثالية لمسارات الملفات. وقد أدخلت لغة C# 11 القيم الثابتة للسلاسل الخام """ للمحتوى متعدد الأسطر الذي لا يتطلب استخدام تسلسلات الهروب.

▶ مثال

CSHARP
string path = @"C:\Users\Doc\file.txt";
string json = """
    {
        "name": "Alice",
        "age": 25
    }
    """;
Console.WriteLine(path);
Console.WriteLine(json.Trim());
▶ جرّب الكود
TEXT 📖 للعرض فقط
C:\Users\Doc\file.txt
{
    "name": "Alice",
    "age": 25
}

نصيحة: في السلاسل النصية الحرفية، تُكتب علامة الاقتباس المزدوجة على النحو التالي: "". وتبدأ السلاسل النصية الأولية وتنتهي بثلاث علامات اقتباس على الأقل.


10. نظرة عامة على StringBuilder

عند ربط السلاسل بشكل متكرر داخل حلقة، يقوم string بإنشاء كائن جديد في كل مرة، مما يؤثر سلبًا على الأداء. أما StringBuilder فيعمل على مخزن مؤقت داخلي ولا يُنتج السلسلة النهائية إلا مرة واحدة.

▶ مثال

CSHARP
using System.Text;

var sb = new StringBuilder();
for (int i = 0; i < 5; i++)
{
    sb.Append(i);
    sb.Append(" ");
}
Console.WriteLine(sb.ToString().Trim());
▶ جرّب الكود
TEXT 📖 للعرض فقط
0 1 2 3 4

نصيحة: يُفضل استخدام StringBuilder عند ربط العديد من السلاسل في حلقة لتقليل تخصيصات الذاكرة بشكل كبير.


11. ترميز الأحرف

تستخدم سلاسل الأحرف في لغة C# ترميز UTF-16. ويشغل الحرف char 2 بايت (وحدة ترميز UTF-16 واحدة).

▶ مثال

CSHARP
char ch = 'A';
Console.WriteLine(ch);
Console.WriteLine((int)ch);
Console.WriteLine(sizeof(char));
▶ جرّب الكود
TEXT 📖 للعرض فقط
A
65
2

❓ أسئلة شائعة

س هل تُقارن السلسلة == المراجع أم القيم؟
ج القيم. فقد تم إعادة تحميل عامل == الخاص بالسلاسل لإجراء مقارنة المساواة في المحتوى.
س لماذا يجب عليّ استخدام StringBuilder لتسلسل السلاسل في الحلقات؟
ج نظرًا لأن string غير قابل للتعديل، فإن كل عملية تسلسل تؤدي إلى إنشاء كائن جديد. أما StringBuilder فيقوم بتعديل المخزن المؤقت ولا يُنشئ السلسلة النهائية إلا في النهاية.
س ما الفرق بين السلسلة الحرفية @"" والسلسلة العادية؟
ج لا تُعالج السلاسل الحرفية تسلسلات الهروب (مثل \n، \t)؛ يتم الاحتفاظ بالشرطات المائلة العكسية حرفياً، مما يجعلها مثالية لمسارات الملفات والتعبيرات العادية.
س ماذا يحدث إذا تجاوزت قيمة Substring النطاق المسموح به؟
ج تُحدث استثناءً من نوع ArgumentOutOfRangeException. يجب عليك التحقق من الطول قبل استدعاء الدالة.

📖 ملخص

📝 تمارين

  1. قم بتعريف متغير من نوع السلسلة واستخدم عملية الاستيفاء لإخراج "My name is XXX, and I am XX years old."
  2. اكتب برنامجًا يأخذ سلسلة أحرف مفصولة بفواصل "a,b,c,d"، ويقسمها باستخدام Split، ثم يعرض كل عنصر في سطر منفصل
  3. احذف السلسلة " Hello World "، ثم استبدل "World" بـ "C#" وأخرج النتيجة
  4. استخدم StringBuilder لربط الأرقام من 1 إلى 100، بحيث يظهر كل رقم في سطر منفصل، ثم اعرض السلسلة النهائية
  5. حدد مسار ملف في نظام Windows C:\Program Files\MyApp\config.json باستخدام سلسلة نصية حرفية، ثم اعرضه
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%