السلاسل متعددة الأسطر في C#: من الحلول المؤقتة إلى C# 11 — دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ذات مرة على Stack Overflow: لعنة السلاسل الطويلة في C#

\n\n

تخيل الموقف. أنت تكتب في C# ملف JSON إعدادات، استعلام SQL، أو لنقل قالب HTML مباشرة في الكود. السلسلة تصبح طويلة، قبيحة، وغير قابلة للقراءة تمامًا. تضغط على Enter لنقل النص... وتحصل على خطأ في الترجمة. مألوف؟

\n\n

سؤال "Multiline string literal in C#" على Stack Overflow حصد عشرات الآلاف من المشاهدات. وهذا ليس من قبيل الصدفة. لفترة طويلة، لم تكن C# اللغة الأكثر ترحيبًا للعمل مع النصوص متعددة الأسطر. لكن الأوقات تتغير. في هذه المقالة، سننتقل من الحلول المؤقتة إلى الحلول الأنيقة التي ظهرت في C# 11.

\n\n

إذا كنت تكتب بلغة C# وتعمل مع القيم النصية متعددة الأسطر، فهذه المادة ستوفر لك ساعات من البحث في Google. هيا بنا!

\n\n

المشكلة: لماذا الضغط على Enter فكرة سيئة؟

\n\n

في C# (كما في C++)، القيمة النصية هي سلسلة من الأحرف محصورة بين علامتي اقتباس. فاصل السطر داخل علامات الاقتباس هذه هو خطأ نحوي. المترجم ببساطة لن يفهم أين تنتهي السلسلة.

\n\n

إليك كيف لا يجب أن تفعل:

\n\n
// خطأ في الترجمة!\nstring query = "SELECT * FROM Users\nWHERE Age > 18\nORDER BY Name";
\n\n

سيرى المترجم "SELECT * FROM Users — وهذا كل شيء. بعد ذلك يأتي الظلام. في الماضي، كان المطورون يتدبرون أمرهم كما يستطيعون. دعنا نستعرض تطور الحلول.

\n\n

الطريقة القديمة: السلسلة الحرفية (Verbatim string @) — المنقذ

\n\n

أول ما يتبادر إلى الذهن هو القيمة النصية الحرفية (verbatim string literal). كل ما عليك فعله هو وضع @ قبل علامة الاقتباس الافتتاحية. هذا يعطل تفسير تسلسلات الهروب (باستثناء علامات الاقتباس المزدوجة "").

\n\n

لكن هناك فارق بسيط: المسافات البادئة تصبح أيضًا جزءًا من السلسلة.

\n\n

مثال مع السلسلة الحرفية (verbatim string):

\n\n
string json = @"{\n    ""name"": ""Alice"",\n    ""age"": 30\n}";\nConsole.WriteLine(json);
\n\n

الإخراج:

\n
{\n    "name": "Alice",\n    "age": 30\n}
\n\n

الإيجابيات:

\n
    \n
  • تعمل في جميع إصدارات C#.
  • \n
  • لا حاجة لهروب الخط المائل العكسي (\\).
  • \n
\n

السلبيات:

\n
    \n
  • يجب مضاعفة علامات الاقتباس الداخلية ("") — وهذا أمر فظيع إذا كان هناك الكثير من JSON.
  • \n
  • المسافات البادئة (مسافات/علامات تبويب) تدخل في السلسلة النهائية.
  • \n
  • لا يمكن خلطها مباشرة مع استيفاء السلسلة ($) (ولكن يمكن $@).
  • \n
\n\n

لا تزال هذه الطريقة شائعة، لكنها ليست مثالية للكود النظيف. حدث الاختراق الحقيقي في C# 11.

\n\n

الطريقة الأحدث: القيمة النصية الخام (Raw string literal) (C# 11 و .NET 7+)

\n\n

بدءًا من C# 11، لدينا القيمة النصية الخام (raw string literal) — حرفيًا "قيمة نصية أولية". إنها تحل 99% من مشاكل تعدد الأسطر.

\n\n

الصيغة: ثلاث علامات اقتباس مزدوجة أو أكثر على التوالي (""").

\n\n

مثال 1: JSON بسيط بدون هروب

\n\n
string json = """\n    {\n        "name": "Alice",\n        "age": 30\n    }\n    """;\nConsole.WriteLine(json);
\n\n

الإخراج:

\n
{\n    "name": "Alice",\n    "age": 30\n}
\n\n

السحر: لا حاجة لمضاعفة علامات الاقتباس داخل السلسلة! المترجم يفهم أن السلسلة انتهت فقط عندما يرى ثلاث علامات اقتباس متتالية.

\n\n

مثال 2: استعلام SQL مع مسافات بادئة

\n\n
string query = """\n    SELECT \n        u.Name,\n        o.OrderDate\n    FROM Users u\n    JOIN Orders o ON u.Id = o.UserId\n    WHERE o.Status = 'Active'\n    ORDER BY o.OrderDate DESC\n    """;\nConsole.WriteLine(query);
\n\n

مهم بخصوص المسافات البادئة: علامات الاقتباس الختامية (""") تحدد المستوى الأساسي للمسافة البادئة. جميع الأسطر التي تحتوي على مسافة بادئة أقل من علامات الاقتباس الختامية سيتم قصها. هذا يسمح بالحفاظ على قابلية قراءة الكود دون إرباك السلسلة بمسافات زائدة.

المدونات

توصيات الكتب