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




size of data types in c# (20)

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

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

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


C # هي لغة يتم استخدامها مع CLR.

هو نوع في C #.

System.String هو نوع في CLR.

عند استخدام C # مع string CLR سيتم تعيينها إلى System.String .

من الناحية النظرية ، يمكنك تنفيذ مترجم C # الذي أنشأ جافا bytecode. من المحتمل أن يقوم التنفيذ المعقول لهذا المترجم java.lang.String string إلى java.lang.String لكي يتفاعل مع مكتبة وقت التشغيل Java.


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


أفضل جواب سمعته عن استخدام الأسماء المستعارة من النوع 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 # لكنني في نهاية المطاف أحاول جعل كوداتي يبدو مثل رمز الإطار.


أود فقط إضافة هذا إلى جواب lfousts ، من كتاب الرماة:

تنص مواصفات لغة C # على أنه "كمسألة أسلوب ، يتم تفضيل استخدام الكلمة الأساسية على استخدام اسم نوع النظام الكامل." أنا لا أتفق مع مواصفات اللغة. أفضّل استخدام أسماء أنواع FCL وتجنب أسماء الأنواع البدائية تمامًا. في الواقع ، أتمنى أن المترجمين لا يقدمون حتى أسماء النوع البدائي والمطورين القسريين لاستخدام أسماء أنواع FCL بدلاً من ذلك. وهنا اسباب بلدي:

لم أحصل على رأيه قبل أن اقرأ الفقرة كاملة.


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

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

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

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

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


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


كلاهما نفس. ولكن من منظور إرشادات التشفير ، من الأفضل استخدام string بدلاً من String . هذا هو ما يستخدمه المطورون بشكل عام. على سبيل المثال بدلاً من استخدام Int32 نستخدم int int اسم مستعار لـ Int32

FYI "سلسلة الكلمات الرئيسية هي ببساطة اسم مستعار للفئة المحددة مسبقًا System.String ." - لغة C # مواصفات 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx


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


هو اسم مستعار في C # لـ System.String .
لذلك من الناحية الفنية ، لا يوجد فرق. انها مثل int مقابل System.Int32 .

بقدر ما يتعلق بالإرشادات ، فمن المستحسن استخدام string أي وقت تشير فيه إلى كائن.

على سبيل المثال

string place = "world";

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

على سبيل المثال

string greet = String.Format("Hello {0}!", place);

هذا هو النمط الذي تميل Microsoft لاستخدامه في الأمثلة الخاصة بهم .

يبدو أن التوجيه في هذا المجال قد تغير ، حيث يفرض StyleCop الآن استخدام الأسماء المستعارة الخاصة بـ C #.


يؤدي استخدام أنواع النظام إلى سهولة التنقل بين C # و VB.Net ، إذا كنت في هذا النوع من الأشياء.


String إلى System.String وهو نوع .NET Framework. string هو اسم مستعار في لغة C # لـ System.String . يتم تجميع كل منهما إلى System.String في IL (اللغة المتوسطة) ، لذلك لا يوجد فرق. اختر ما تريده واستخدمه. إذا قمت بالتعليمة البرمجية في C # ، فأنا أفضل string كما هو اسم مستعار نوع C # ومعروفة من قبل C # المبرمجين.

أستطيع أن أقول الشيء نفسه عن ( int ، System.Int32 ) الخ ..


String ليست كلمة رئيسية ويمكن استخدامها كمعرف في حين أن string عبارة عن كلمة رئيسية ولا يمكن استخدامها كمعرّف. وفي وجهة نظر وظيفية كلاهما نفس.


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

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


string كلمة محجوزة ، لكن String هو مجرد اسم فئة. وهذا يعني أنه لا يمكن استخدام string كاسم متغير بنفسها.

إذا كنت تريد ، لسبب ما ، متغيرًا يسمى string ، فسترى أول هذه التجميعات فقط:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

إذا كنت تريد حقًا اسم متغير يسمى string ، يمكنك استخدام @ كبادئة:

StringBuilder @string = new StringBuilder();

فرق آخر حاسم: يسلط الضوء عليها بشكل مختلف.


string هو مجرد اسم مستعار لـ System.String . سوف يعاملهم المترجم بشكل متماثل.

والفرق العملي الوحيد هو تسليط الضوء على بناء الجملة كما ذكرت ، ويجب عليك الكتابة using System إذا كنت تستخدم String .


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

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


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


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


نعم ، هذا لا فرق بينهما ، تماما مثل boolو Boolean.







alias