String و string في C#: هل هما نفس الشيء أم لا؟ تحليل مع أمثلة
\n\nإذا كنت قد كتبت كودًا بلغة C# من قبل، فبالتأكيد لاحظت أنه يمكن تعريف السلاسل النصية بطريقتين:
\n\nstring 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.
عندما يرى المترجم string، فإنه يستبدلها تلقائيًا بـ System.String. هذا يعني أن كلا التعريفين يتم تجميعهما إلى نفس كود IL:
// هذان السطران متطابقان تمامًا على مستوى IL\nstring a = "Hello";\nSystem.String b = "World";\n\nإذا فتحت ملف .dll أو .exe المُجمّع باستخدام ILSpy أو dotPeek، فلن تجد أي فرق بين هذين التعريفين.
\n\nولكن لماذا يوجد كلا الخيارين؟
\n\nتاريخيًا، ورثت C# بناء الجملة من C/C++، حيث string ليست كلمة مفتاحية بل فئة. قرر مطورو .NET إضافة أسماء مستعارة مريحة لجعل الكود يبدو أكثر طبيعية ومألوفة للمبرمجين القادمين من لغات أخرى.
بالإضافة إلى ذلك، الأسماء المستعارة لا تتطلب تضمين مساحة الاسم. لاستخدام String، تحتاج إما إلى إضافة using System; أو كتابة الاسم الكامل System.String. أما مع string فلا توجد هذه المشكلة - فهو متاح دائمًا.
متى تستخدم string ومتى تستخدم String؟
\n\nالقاعدة الذهبية التي تتبعها معظم الفرق والتي توصي بها Microsoft في وثائق C#:
\n\n- \n
- استخدم
stringعند تعريف المتغيرات، معاملات الدوال، القيم المُرجعة - في كل مكان تعمل فيه هذه الكلمة المفتاحية كنوع. \n - استخدم
Stringفقط عند الوصول إلى الدوال الثابتة للفئة (مثلString.IsNullOrEmpty()) أو عند استخدامSystem.Stringفي الحالات النادرة التي تحتاج فيها إلى تحديد مساحة الاسم صراحةً. \n
لماذا؟ لأن string هي كلمة مفتاحية للغة، تبرز بلون مختلف في بيئة التطوير المتكاملة (IDE) ومن الواضح أنها سلسلة نصية. أما String فهو مجرد اسم فئة، ويسهل الخلط بينه وبين فئات أخرى.
مثال على الأسلوب الجيد
\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؟ أم العكس؟
الإجابة: لا يوجد فرق في الأداء. لا شيء. على الإطلاق. بعد التجميع، يتحول كلا الخيارين إلى نفس كود IL. في الوقت