c# - ما الفرق بين السلسلة والسلسلة في C #؟



15 Answers

فقط من أجل الاكتمال ، ها هو مخبأ للمعلومات ذات الصلة ...

كما لاحظ آخرون ، string هو اسم مستعار لـ System.String . انهم جمع لنفس القانون ، لذلك في وقت التنفيذ لا يوجد فرق على الإطلاق. هذا هو واحد فقط من الأسماء المستعارة في C #. القائمة الكاملة هي:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

وبصرف النظر عن string object ، فإن الأسماء المستعارة كلها قيمة لأنواع. decimal هو نوع قيمة ، ولكن ليس نوعًا بدائيًا في CLR. النوع الأولي الوحيد الذي ليس لديه اسم مستعار هو System.IntPtr .

في المواصفات ، تُعرف الأسماء المستعارة لنوع القيمة باسم "أنواع بسيطة". يمكن استخدام الحُرَف في القيم الثابتة لكل نوع بسيط ؛ لا توجد أنواع قيم أخرى لها نماذج حرفية متاحة. (قارن ذلك بـ VB ، والذي يسمح DateTime الزمنية لـ DateTime ، ولديه اسم مستعار أيضًا.)

هناك ظرف واحد يجب أن تستخدم فيه الأسماء المستعارة: عندما تحدد صراحة نوعًا أساسيًا للتعداد. على سبيل المثال:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

هذه مجرد مسألة الطريقة التي تحدد بها المواصفات التعدادية - الجزء بعد القولون يجب أن يكون الإنتاج المتكامل ، وهو رمز واحد من sbyte ، byte ، short ، ushort ، int ، uint ، long ، ulong ، char . .. على عكس نوع الإنتاج كما يستخدم من قبل الإعلانات المتغيرة على سبيل المثال. لا يشير إلى أي اختلاف آخر.

أخيراً ، عندما يتعلق الأمر باستخدام: شخصياً ، أستخدم الأسماء المستعارة في كل مكان للتنفيذ ، ولكن نوع CLR لأي APIs. حقا لا يهم كثيرا الذي تستخدمه من حيث التنفيذ - الاتساق بين فريقك هو لطيف ، ولكن لا أحد آخر سيهتم. من ناحية أخرى ، من المهم بشكل حقيقي أنه إذا كنت تشير إلى نوع في API ، فإنك تفعل ذلك بطريقة محايدة بلغة. تعتبر طريقة تسمى ReadInt32 لا لبس فيها ، بينما تتطلب طريقة تسمى ReadInt التفسير. يمكن أن يستخدم المتصل لغة تحدد اسم مستعار لـ Int16 ، على سبيل المثال. يتبع مصممو إطار .NET هذا النمط ، توجد أمثلة جيدة في فئات BinaryReader و BinaryReader و Convert .

c# .net string types alias

مثال ( لاحظ الحالة ):

string s = "Hello world!";
String s = "Hello world!";

ما هي المبادئ التوجيهية لاستخدام كل منها؟ وما هي الاختلافات ؟




أفضل جواب سمعته عن استخدام الأسماء المستعارة من النوع C # يأتي من جيفري ريختر في كتابه CLR Via C # . هنا له 3 أسباب:

  • لقد رأيت عددًا من المطورين مشوشين ، لا يعرفون ما إذا كان سيتم استخدام سلسلة أو سلسلة في التعليمات البرمجية الخاصة بهم. لأنه في C # تعيين سلسلة (كلمة أساسية) تماماً إلى System.String (نوع FCL) ، لا يوجد اختلاف ويمكن استخدام إما.
  • في C # ، خرائط طويلة إلى System.Int64 ، ولكن في لغة برمجة مختلفة ، يمكن تعيين طويلة إلى Int16 أو Int32 . في الواقع ، C ++ / CLI في الواقع تعامل طالما Int32 . يمكن لشخص ما قراءة التعليمات البرمجية المصدر في لغة واحدة بسهولة تفسير تفسير نية الكود إذا تم استخدامه أو البرمجة في لغة برمجة مختلفة. في الواقع ، لن تعامل معظم اللغات حتى الكلمة الرئيسية ولن تقوم بتجميع التعليمات البرمجية التي تستخدمها.
  • يحتوي FCL على العديد من الطرق التي تحتوي على أسماء الأنواع كجزء من أسماء الطرق الخاصة بها. على سبيل المثال ، يوفر نوع BinaryReader أساليب مثل ReadBoolean ReadInt32 ReadSingle وهكذا ، ويقدم نوع System.Convert أساليب مثل ToBoolean و ToInt32 و ToSingle وهكذا. على الرغم من أنه من القانوني كتابة التعليمة البرمجية التالية ، فإن الخط الذي يحتوي على عوامة يبدو غير طبيعي بالنسبة لي ، وليس من الواضح أن الخط صحيح:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

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




هناك اختلاف واحد - لا يمكنك استخدام String دون using System; سلفا.




System.String هو فئة سلسلة. NET - في string C # هو اسم مستعار لـ System.String - لذا فهي في نفس الحالة.

أما بالنسبة للإرشادات ، فإنني لن أتورط في ذلك ، وأستخدم فقط أيًا كان ما تشاء - فهناك أشياء أكثر أهمية في الحياة ، وستكون الشفرة هي نفسها على أي حال.

إذا وجدت أنظمة بناء لديك حيث من الضروري تحديد حجم الأعداد الصحيحة التي تستخدمها وبالتالي تميل إلى استخدام Int16 و Int32 و UInt16 و UInt32 إلخ. قد يبدو من الطبيعي استخدام String - وعند التنقل بين مختلف لغات .net قد تجعل الأمور أكثر قابلية للفهم - وإلا سأستخدم سلسلة و int.




string و String متطابقان بكل الطرق (باستثناء الحرف "S"). لا توجد أي آثار الأداء في كلتا الحالتين.

يُفضل استخدام string الأحرف الصغيرة في معظم المشروعات نظرًا لتمييزها في بناء الجملة




يوضح مقطع فيديو YouTube هذا عمليا كيف تختلف.

ولكن الآن للحصول على إجابة نصية طويلة.

عندما نتحدث عن. .NET هناك نوعان من الأشياء المختلفة واحد هناك إطار عمل .NET والأخرى هناك لغات ( C# ، VB.NET وغيرها) التي تستخدم هذا الإطار.

" System.String " aka "String" (رأس المال "S") هو نوع بيانات .NET Framework بينما "string" هو نوع بيانات C# .

باختصار "String" هو اسم مستعار (نفس الشيء يسمى بأسماء مختلفة) من "string". لذلك من الناحية الفنية كل من العبارات أدناه سوف تعطي نفس المخرجات.

String s = "I am String";

أو

string s = "I am String";

بنفس الطريقة هناك أسماء مستعارة لنوع بيانات c # أخرى كما هو موضح أدناه: -

الكائن: System.Object ، string: System.String ، bool: System.Boolean ، البايت: System.Byte ، sbyte: System.SByte ، short: System.Int16 وهكذا

الآن السؤال مليون دولار من وجهة نظر مبرمج حتى عندما تستخدم "سلسلة" و "سلسلة"؟

أول شيء لتجنب الخلط استخدام واحد منهم باستمرار. ولكن من منظور أفضل الممارسات عند القيام بتعريف متغير ، من الجيد استخدام "string" (صغير "s") وعندما تستخدمه كاسم فئة ، فإن "String" (رأس المال "S") يفضل.

في الجزء السفلي من التعليمات البرمجية ، يكون الجانب الأيسر عبارة عن تعريف متغير وأعلن باستخدام "string". على الجانب الأيسر ، نطلق على هذا الأسلوب طريقة "String" أكثر منطقية.

string s = String.ToUpper() ;



string الأحرف string هو اسم مستعار لـ System.String . هم نفس في C# .

هناك جدل حول ما إذا كان يجب عليك استخدام أنواع النظام ( System.Int32 ، System.String ، إلخ.) أو C# aliases ( int ، string ، إلخ). أنا شخصيا أعتقد أنه يجب عليك استخدام C# aliases ، ولكن هذا فقط تفضيل شخصي.




كما يقول الآخرون ، هم نفس الشيء. قواعد StyleCop ، افتراضياً ، ستفرض عليك استخدام string كأفضل ممارسة String.Format String.Join C # ، باستثناء عند الإشارة إلى الدالات الثابتة System.String ، مثل String.Format ، String.Join ، String.Join ، الخ ...




ضد ما يبدو أنه ممارسة شائعة بين المبرمجين الآخرين ، أفضل String عبر string ، فقط لتسليط الضوء على حقيقة أن String هي نوع مرجع ، كما ذكر جون سكيت.




String ( System.String ) هي فئة في مكتبة الفئة الأساسية. السلسلة (الحالة الصغيرة) هو عمل محجوز في C # وهو اسم مستعار لـ System.String. Int32 vs int هي حالة مشابهة كما هو Boolean vs. bool . تمكنك هذه الكلمات الرئيسية الخاصة بلغة C # من إعلان الأوليات في نمط مشابه لـ C.




تأتي متأخرة إلى الحفلة: أستخدم أنواع CLR 100٪ من الوقت (جيد ، إلا إذا أجبرت على استخدام نوع C # ، لكنني لا أتذكر متى كانت المرة الأخيرة).

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

الآن بعد أن كنت أفعل ذلك لسنوات ، إنها عادة وأحب التلوين الذي تعرضه VS لأنواع CLR.

الموفر الحقيقي الوحيد هو أن الإكمال التلقائي يستخدم نوع C # ، لذلك انتهى بي الأمر بإعادة كتابة الأنواع التي تم إنشاؤها تلقائيًا لتحديد نوع CLR بدلاً من ذلك.

أيضا ، الآن ، عندما أرى كلمة "int" أو "string" ، يبدو الأمر خاطئًا بالنسبة لي تمامًا ، كأنني أبحث عن رمز C عام 1970.




إنها مسألة اتفاقية ، حقا. string يبدو فقط مثل نمط C / C ++.الاتفاقية العامة هي استخدام أي اختصارات قدمت لغتك المختارة (int / Int for Int32). هذا ينطبق على "الكائن" decimalوكذلك.

من الناحية النظرية ، قد يساعد هذا في إدخال رمز المنفذ إلى بعض المقاييس 64 بت في المستقبل والتي قد تعني كلمة "int" Int64، ولكن هذا ليس هو الهدف ، وأتوقع أن يقوم أي معالج ترقية بتغيير أي intإشارات إلى Int32أي طريقة تكون آمنة.




إجابة جديدة بعد 6 سنوات و 5 أشهر (التسويف).

في حين stringأن الكلمة الرئيسية C # المحجوزة دائمًا ما يكون لها معنى ثابت ، Stringفهي مجرد مُعرّف عادي يمكن أن يشير إلى أي شيء. استنادًا إلى أعضاء النوع الحالي ، قد تكون مساحة الاسم الحالية usingوالتوجيهات المطبقة وموضعها Stringقيمة أو نوعًا مختلفًا عن global::System.String.

سأقدم مثالين usingلن تساعدهما التوجيهات .

أولاً ، عندما Stringتكون قيمة النوع الحالي (أو متغير محلي):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

لن يتم ترجمة ما سبق لأنه IEnumerable<>لا يحتوي على عضو غير ثابت يسمى Format، ولا توجد طرق تمديد مطبقة. في الحالة المذكورة أعلاه ، قد يكون من الممكن استخدامها Stringفي سياقات أخرى حيث يكون النوع هو الاحتمال الوحيد في بناء الجملة. على سبيل المثال String local = "Hi mum!";يمكن أن يكون موافق (اعتمادا على مساحة الاسم usingوالتوجيهات).

الأسوأ من ذلك: من String.Concat(someSequence)المحتمل أن يكون النطق (حسب usings) هو الذهاب إلى طريقة تمديد Linq Enumerable.Concat. لن تذهب إلى الأسلوب الساكن string.Concat.

ثانيًا ، عندما Stringيكون نوع آخر متداخلًا داخل النوع الحالي:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

لا البيان في Exampleالطريقة compile. هنا Stringهو دائما البيانو string ، MyPiano.String. لا يوجد عضو ( staticأو لا) Formatموجود عليه (أو موروث من فئته الأساسية). ولا "Goodbye"يمكن تحويل القيمة إليه.




string هي كلمة أساسية ، ولا يمكنك استخدام السلسلة كمعرّف.

السلسلة ليست كلمة رئيسية ، ويمكنك استخدامها كمعرّف:

مثال

string String = "I am a string";

تمثل الكلمة الرئيسية stringاسمًا مستعارًا System.Stringبعيدًا عن مشكلة الكلمة الرئيسية ، وهما مماثلان تمامًا.

 typeof(string) == typeof(String) == typeof(System.String)



لا يوجد فرق بين الاثنين - string، ومع ذلك ، يبدو أن الخيار المفضل عند النظر في شفرة المصدر للمطورين الآخرين.




Related