يبني استيفاء النصوص (string interpolation) نصًا من نص حرفي وتعابير. ضع البادئة $ قبل القيمة الحرفية، وضع أي تعبير C# بين أقواس معقوصة، فتُحوَّل قيمته إلى نص وتُدرج:
المخرجات:
Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes
وصل الاستيفاء في C# 6. يحوّله المترجم إلى استدعاء string.Format أو string.Concat (أو، منذ C# 10، إلى شيفرة معالج أكفأ)، فلا يكون أبطأ من بناء النص يدويًا.
يحتاج التعبير الشرطي في السطر الأخير إلى أقواس. داخل فتحة الاستيفاء تبدأ النقطتان محدّد تنسيق، فتكون {x > 10 ? "yes" : "no"} دون أقواس خطأ ترجمة.
محدّدات التنسيق
بعد التعبير تتحكم نقطتان ونص تنسيق في طريقة كتابة القيمة. تعمل نصوص التنسيق نفسها مع ToString("...") وstring.Format.
المخرجات:
1234567.89
1,234,567.89
1,234,568
00042
FF
00ff
1.23E+006
0.813
81.3%
1,234,567.89
007.5
3.1
الرموز القياسية، ويمكن أن يلي كلًّا منها رقم دقة:
| الرمز | الاسم | المثال | النتيجة |
|---|---|---|---|
F أو F2 | فاصلة ثابتة | {3.14159:F2} | 3.14 |
N أو N0 | رقم بفواصل التجميع | {1234.56:N0} | 1,235 |
C | عملة (رمز الثقافة ونمطها) | {9.5:C} في en-US | $9.50 |
D5 | عدد صحيح مبطّن بالأصفار | {42:D5} | 00042 |
X، x | ست عشري | {255:X} | FF |
E2 | علمي | {1234.5:E2} | 1.23E+003 |
P1 | نسبة مئوية (يضرب في 100) | {0.256:P1} في en-US | 25.6% |
G | عام (الأقصر) | {2.50m:G} | 2.50 |
R | ذهاب وإياب (double) | {0.1:R} | 0.1 |
تبني الأنماط المخصصة التنسيق من عناصر نائبة: 0 رقم يظهر دائمًا، و# رقم يظهر فقط إن كان معنويًا، و. الفاصلة العشرية، و, داخل الرقم تفعّل فواصل التجميع، و% تضرب في 100. يُظهر "0.##" حتى منزلتين عشريتين ويحذف الأصفار اللاحقة؛ و"#,##0.00" هو التنسيق المحاسبي التقليدي.
كل تنسيق رقمي يقرّب القيمة المعروضة؛ والمتغيّر نفسه لا يتغيّر. حين تقع القيمة في المنتصف تمامًا (2.25 معروضة بمنزلة عشرية واحدة) قد تقرّب أوقات تشغيل وأنواع مختلفة حالة التعادل بشكل مختلف، فإن كانت القاعدة مهمة فقرّب صراحة أولًا بـ Math.Round(value, 1, MidpointRounding.AwayFromZero) ثم نسّق.
التواريخ في الاستيفاء
تأخذ قيم DateTime نصوص تنسيق التواريخ بالطريقة نفسها:
المخرجات:
2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours
يتطلب التنسيق المخصص لـ TimeSpan هروب المحارف الحرفية بشرطة مائلة عكسية، تُكتب في القيمة النصية العادية \\:. القائمة الكاملة لرموز التواريخ (yyyy وMM وHH وtt...) والأخطاء التي يرتكبها الناس معها (mm للدقائق وMM للأشهر) في تنسيق DateTime.
المحاذاة والتبطين
تحدد فاصلة بعد التعبير عرضًا أدنى للحقل. العدد الموجب يحاذي القيمة إلى نهاية الحقل (تُضاف المسافات قبلها)، والعدد السالب يحاذيها إلى بدايته (تُضاف المسافات بعدها). ومع التنسيق يصفّ الجداول في النص العادي:
المخرجات:
Item | Price| Sold
----------------------------
Espresso | 2.40| 118
Latte | 3.60| 64
Hot chocolate | 4.25| 9
الصياغة {expression,alignment:format}: المحاذاة أولًا ثم التنسيق. القيمة الأطول من العرض لا تُقتطع؛ بل تدفع بقية السطر. وتؤدي PadLeft وPadRight التبطين نفسه خارج الاستيفاء.
هروب الأقواس المعقوصة
لطباعة قوس حرفي ضاعفه: {{ و}}. يحدث هذا حين تكون المخرجات JSON أو CSS أو شيفرة:
المخرجات:
{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}
بناء JSON يدويًا هكذا مقبول لسطر سجل سريع؛ أما لـ JSON حقيقي فاستخدم أداة تسلسل، فهي تتعامل بشكل صحيح مع علامات الاقتباس والمحارف الخاصة داخل name.
string.Format والتنسيق المركّب
قبل C# 6 كان التنسيق يتم بـ string.Format، التي تأخذ عناصر نائبة مرقّمة وقائمة وسائط. تقبل Console.WriteLine وStringBuilder.AppendFormat وTextWriter.Write صياغة التنسيق المركّب نفسها:
المخرجات:
Notebook x4: 14.00
Notebook | 3.50
echo echo !
Dear Leo, your order #000731 has shipped.
فضّل الاستيفاء في الشيفرة: تجلس القيم حيث تظهر، فلا يمكن لعنصر نائب أن يشير إلى الوسيط الخطأ. تبقى string.Format الأداة الصحيحة حين يكون القالب بيانات، مثل رسالة مترجمة محمّلة من ملف موارد. فهرس عنصر نائب بلا وسيط مقابل ({2} مع وسيطين) يرمي FormatException وقت التشغيل.
الثقافة: التحكم في الفواصل والعملة
يستخدم الاستيفاء وToString وstring.Format كلها الثقافة الحالية للخيط افتراضيًا. على جهاز مضبوط على الألمانية تنتج {1234.5:N2} القيمة 1.234,50؛ وفي الولايات المتحدة تنتج 1,234.50. ويستخدم تنسيق العملة C رمز الثقافة. لاختيار الثقافة صراحة التقط النص المستوفى كـ FormattableString ونسّقه بمزوّد:
المخرجات:
Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75
استخدم ثقافة المستخدم للنص الذي يقرؤه الناس، وCultureInfo.InvariantCulture لكل ما يقرؤه برنامج آخر. ملف CSV مكتوب بالثقافة الحالية على جهاز ألماني يحتوي على فواصل داخل الأرقام ولا يمكن قراءته في مكان آخر. في .NET 6 وما بعده تفعل string.Create(CultureInfo.InvariantCulture, $"...") ما تفعله FormattableString.Invariant دون الكائن الوسيط.
النصوص المستوفاة الحرفية والخام
تتّحد $ مع @ لنص مستوفى حرفي (verbatim): الشرطات المائلة العكسية حرفية ويمكن للنص الامتداد على عدة أسطر. تقبل C# 8 وما بعدها الترتيبين ($@ أو @$)؛ وتتطلب C# 6 و7 الشكل $@:
المخرجات:
C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026
أضافت C# 11 النصوص المستوفاة الخام. مع $ واحدة تميّز الأقواس التعابير كالمعتاد. ومع $$ يكون القوس المفرد حرفيًا وتحتاج التعابير إلى قوسين، وهذا يجعل قوالب JSON والشيفرة سهلة القراءة:
// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
{
"id": {{id}},
"name": "{{name}}"
}
""";
تسمح C# 11 أيضًا بأسطر جديدة داخل فتحة الاستيفاء، فيمكن تقسيم تعبير طويل أو تعبير switch على عدة أسطر.
أخطاء شائعة
- نسيان
$. تطبع"Total: {total}"الأقواس حرفيًا. ولا يحذّر المترجم. - معامل ثلاثي دون أقواس داخل الأقواس المعقوصة: تُقرأ النقطتان كفاصل تنسيق.
- تنسيق المخرجات المقروءة آليًا بالثقافة الحالية. الفواصل العشرية تكسر CSV وJSON وSQL. استخدم الثقافة الثابتة.
- استخدام
ToString()دون تنسيق للمال. تُطبع2.5mكـ2.5لا2.50. استخدمF2أوN2أوC. - بناء نصوص كبيرة بالاستيفاء في حلقة. كل تكرار ينشئ نصًا جديدًا؛ استخدم StringBuilder أو
string.Join.
الأسئلة الشائعة
ما هو استيفاء النصوص في C#؟
قيمة نصية حرفية تسبقها $ تُقيَّم فيها التعابير داخل الأقواس المعقوصة وتُدرج: $"Total: {price * qty}". أُضيف في C# 6 ويحلّ محل معظم استخدامات string.Format والضمّ بـ +. يعمل أي تعبير داخل الأقواس، بما في ذلك استدعاءات الدوال والوصول إلى الخصائص.
كيف أنسّق رقمًا بمنزلتين عشريتين في C#؟
أضف محدّد تنسيق بعد نقطتين: تطبع $"{price:F2}" رقمين بعد الفاصلة العشرية، وتفعل $"{price:N2}" الشيء نفسه مع فواصل الآلاف. خارج الاستيفاء تعمل الرموز نفسها مع price.ToString("F2"). كلاهما يقرّب القيمة للعرض دون تغييرها.
كيف أهرّب الأقواس المعقوصة في نص مستوفى في C#؟
ضاعفها: {{ تطبع { و}} تطبع }. مثلًا $"{{ \"id\": {id} }}" تطبع { "id": 42 }. في النصوص المستوفاة الخام في C# 11 يمكنك بدلًا من ذلك بدء القيمة الحرفية بـ $$ فتصبح الأقواس المفردة حرفية ويميّز {{expr}} التعبير.
ما الفرق بين string.Format واستيفاء النصوص؟
ينتجان النتيجة نفسها برموز التنسيق نفسها. تشير string.Format("{0} costs {1:F2}", name, price) إلى الوسائط بموضعها؛ وتضع $"{name} costs {price:F2}" التعابير في مكانها، فهي أسهل قراءة ولا يمكن أن تخطئ في ترتيب الوسائط. ما زالت string.Format لازمة حين يأتي نص التنسيق نفسه من ملف موارد أو قاعدة بيانات.
لماذا يظهر رقمي المستوفى بفاصلة بدل النقطة؟
ينسّق الاستيفاء بالثقافة الحالية للخيط، وثقافات كثيرة تستخدم الفاصلة فاصلًا عشريًا. للمخرجات التي تقرؤها الآلات (الملفات وJSON وعناوين URL) نسّق بالثقافة الثابتة: FormattableString.Invariant($"{value:F2}")، أو في .NET 6 وما بعده string.Create(CultureInfo.InvariantCulture, $"...").