[C#] ما الفرق بين السلسلة والسلسلة في C #؟


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 .

Question

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

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

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




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

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

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




يوضح مقطع فيديو 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 ، فقط لتسليط الضوء على حقيقة أن String هي نوع مرجع ، كما ذكر جون سكيت.




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




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

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




أفضل جواب سمعته عن استخدام الأسماء المستعارة من النوع 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، ومع ذلك ، يبدو أن الخيار المفضل عند النظر في شفرة المصدر للمطورين الآخرين.




Yes, that's no difference between them, just like the bool and Boolean .




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




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

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




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




New answer after 6 years and 5 months (procrastination).

While string is a reserved C# keyword that always has a fixed meaning, String is just an ordinary identifier which could refer to anything. Depending on members of the current type, the current namespace and the applied using directives and their placement, String could be a value or a type distinct from global::System.String .

I shall provide two examples where using directives will not help .

First, when String is a value of the current type (or a local variable):

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

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

The above will not compile because IEnumerable<> does not have a non-static member called Format , and no extension methods apply. In the above case, it may still be possible to use String in other contexts where a type is the only possibility syntactically. For example String local = "Hi mum!"; could be OK (depending on namespace and using directives).

Worse: Saying String.Concat(someSequence) will likely (depending on using s) go to the Linq extension method Enumerable.Concat . It will not go to the static method string.Concat .

Secondly, when String is another type , nested inside the current type:

class MyPiano
{
  protected class String
  {
  }

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

Neither statement in the Example method compiles. Here String is always a piano string , MyPiano.String . No member ( static or not) Format exists on it (or is inherited from its base class). And the value "Goodbye" cannot be converted into it.




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

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

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

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

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




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

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




Links