String مقابل string في C#: ما الفرق وأيهما تختار؟

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

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

ابدأ الدورة

String و string في C#: هل هما نفس الشيء أم لا؟ تحليل مع أمثلة

\n\n

إذا كنت قد كتبت كودًا بلغة C# من قبل، فبالتأكيد لاحظت أنه يمكن تعريف السلاسل النصية بطريقتين:

\n\n
string name = "آنا";\nString greeting = "مرحبًا!";
\n\n

وكلا الخيارين يعملان. يطرح سؤال منطقي: ما الفرق بين string و String في C#؟ هل هما نوعان مختلفان؟ هل أحدهما أسرع؟ أم أنها مجرد نزوة من مطوري اللغة؟

\n\n

إجابة مختصرة: لا يوجد فرق. لكن الأمور ليست بهذه البساطة كما تبدو للوهلة الأولى. دعنا نفهم الأمر حقًا، حتى لا تعرف فقط إجابة السؤال الشائع على Stack Overflow، بل تفهم لماذا تم تصميمها بهذه الطريقة وأي خيار من الأفضل استخدامه في المشاريع الحقيقية.

\n\n

إجابة مختصرة: string هو اسم مستعار لـ System.String

\n\n

في C#، الكلمة المفتاحية string هي مجرد اسم مستعار (alias) للفئة System.String. تمامًا مثلما أن int هو اسم مستعار لـ System.Int32، و bool لـ System.Boolean.

\n\n

عندما يرى المترجم string، فإنه يستبدلها تلقائيًا بـ System.String. هذا يعني أن كلا التعريفين يتم تجميعهما إلى نفس كود IL:

\n\n
// هذان السطران متطابقان تمامًا على مستوى IL\nstring a = "Hello";\nSystem.String b = "World";
\n\n

إذا فتحت ملف .dll أو .exe المُجمّع باستخدام ILSpy أو dotPeek، فلن تجد أي فرق بين هذين التعريفين.

\n\n

ولكن لماذا يوجد كلا الخيارين؟

\n\n

تاريخيًا، ورثت C# بناء الجملة من C/C++، حيث string ليست كلمة مفتاحية بل فئة. قرر مطورو .NET إضافة أسماء مستعارة مريحة لجعل الكود يبدو أكثر طبيعية ومألوفة للمبرمجين القادمين من لغات أخرى.

\n\n

بالإضافة إلى ذلك، الأسماء المستعارة لا تتطلب تضمين مساحة الاسم. لاستخدام String، تحتاج إما إلى إضافة using System; أو كتابة الاسم الكامل System.String. أما مع string فلا توجد هذه المشكلة - فهو متاح دائمًا.

\n\n

متى تستخدم string ومتى تستخدم String؟

\n\n

القاعدة الذهبية التي تتبعها معظم الفرق والتي توصي بها Microsoft في وثائق C#:

\n\n
    \n
  • استخدم string عند تعريف المتغيرات، معاملات الدوال، القيم المُرجعة - في كل مكان تعمل فيه هذه الكلمة المفتاحية كنوع.
  • \n
  • استخدم String فقط عند الوصول إلى الدوال الثابتة للفئة (مثل String.IsNullOrEmpty()) أو عند استخدام System.String في الحالات النادرة التي تحتاج فيها إلى تحديد مساحة الاسم صراحةً.
  • \n
\n\n

لماذا؟ لأن string هي كلمة مفتاحية للغة، تبرز بلون مختلف في بيئة التطوير المتكاملة (IDE) ومن الواضح أنها سلسلة نصية. أما String فهو مجرد اسم فئة، ويسهل الخلط بينه وبين فئات أخرى.

\n\n

مثال على الأسلوب الجيد

\n\n
// تعريف متغير (نستخدم string)\nstring userName = "إيفان";\n\n// استدعاء دالة ثابتة (نستخدم String)\nif (String.IsNullOrEmpty(userName))\n{\n    Console.WriteLine("لا يمكن أن يكون الاسم فارغًا");\n}\n\n// معامل دالة (نستخدم string)\npublic void Greet(string name)\n{\n    Console.WriteLine($"مرحبًا، {name}!");\n}
\n\n

هل هناك فرق في الأداء؟

\n\n

يتساءل العديد من المطورين: هل string أسرع من String؟ أم العكس؟

\n\n

الإجابة: لا يوجد فرق في الأداء. لا شيء. على الإطلاق. بعد التجميع، يتحول كلا الخيارين إلى نفس كود IL. في الوقت

المدونات

توصيات الكتب