سؤال

مثال (لاحظ هذه القضية):

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

ما هي القواعد الارشادية لاستخدام كل؟وما هي اختلافات?

هل كانت مفيدة؟

المحلول

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

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

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

string place = "world";

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

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

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

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

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

نصائح أخرى

فقط من أجل الاكتمال، وهنا تفريغ الدماغ من المعلومات ذات الصلة ...

وكما لاحظ آخرون، 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 حرفية، ولها اسم مستعار لها أيضًا.)

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

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

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

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

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

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

أفضل إجابة سمعتها على الإطلاق حول استخدام الأسماء المستعارة للنوع المتوفرة في لغة C# تأتي من جيفري ريختر في كتابه CLR عبر C#.فيما يلي أسبابه الثلاثة:

  • لقد رأيت عددًا من المطورين في حيرة من أمرهم، ولا يعرفون ما إذا كانوا سيستخدمون أم لا خيط أو خيط في الكود الخاص بهم.لأنه في C#، يتم تعيين السلسلة (الكلمة الأساسية) تمامًا إلى System.String (نوع FCL)، فلا يوجد فرق ويمكن استخدام أي منهما.
  • شركة#، طويل خرائط ل System.Int64, ولكن بلغة برمجة مختلفة طويل يمكن تعيين ل كثافة العمليات16 أو Int32.في الواقع، C++/CLI يعامل في الواقع على أنه ملف Int32.يمكن لأي شخص يقرأ كود المصدر بلغة واحدة أن يسيء تفسير غرض الكود بسهولة إذا كان معتادًا على البرمجة بلغة برمجة مختلفة.في الواقع، معظم اللغات لن تعالج حتى طويل ككلمة رئيسية ولن يقوم بتجميع التعليمات البرمجية التي تستخدمها.
  • يحتوي FCL على العديد من الأساليب التي تحتوي على أسماء أنواع كجزء من أسماء الطرق الخاصة بها.على سبيل المثال، BinaryReader يقدم النوع طرقًا مثل قراءة منطقية, قراءةInt32, قراءة واحدة, ، وما إلى ذلك، و 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 هي كلمة محجوزة، ولكن String هو مجرد اسم فئة.هذا يعني ذاك string لا يمكن استخدامه كاسم متغير بمفرده.

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

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

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

StringBuilder @string = new StringBuilder();

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

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

لقد تم تغطيتها أعلاه؛ومع ذلك، لا يمكنك استخدام string في التفكير؛عليك أن تستعمل String.

System.String هي فئة سلسلة .NET - في C# string هو اسم مستعار ل System.String - لذلك في الاستخدام هم نفس الشيء.

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

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

أفضّل الكتابة بالأحرف الكبيرة .NET الأنواع (بدلاً من الأسماء المستعارة) لأسباب تتعلق بالتنسيق.ال .NET يتم تلوين الأنواع بنفس لون أنواع الكائنات الأخرى (أنواع القيمة هي كائنات مناسبة، بعد كل شيء).

الكلمات الرئيسية الشرطية والتحكمية (مثل if, switch, ، و return) بأحرف صغيرة وملونة باللون الأزرق الداكن (افتراضيًا).وأنا أفضل ألا يكون هناك خلاف في الاستخدام والشكل.

يعتبر:

String someString; 
string anotherString; 

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

أحرف صغيرة string هو المفضل في معظم المشاريع بسبب تسليط الضوء على بناء الجملة

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

string هو نوع في C#.

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

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

من الناحية النظرية، يمكنك تنفيذ مترجم C# الذي أنشأ كود Java الثانوي.من المحتمل أن يتم رسم خريطة للتنفيذ المعقول لهذا المترجم string ل java.lang.String من أجل التفاعل مع مكتبة وقت تشغيل Java.

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

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

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

enter image description here

"System.String"ويعرف أيضًا باسم "سلسلة" (الحرف الكبير "S") هو .NET نوع بيانات الإطار بينما "السلسلة" هي C# نوع البيانات.

enter image description here

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

String s = "I am String";

أو

string s = "I am String";

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

هدف: System.Object, ، خيط: System.String, ، منطقي: System.Boolean, البايت: System.Byte, ، سبيتي: System.SByte, ، قصير: System.Int16 وما إلى ذلك وهلم جرا

الآن سؤال المليون دولار من وجهة نظر المبرمج، فمتى نستخدم "String" و"string"؟

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

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

string s = String.ToUpper() ;

أحرف صغيرة string هو اسم مستعار ل System.String.هم نفس الشيء في C#.

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

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

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

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

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

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

إجابة جديدة بعد 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) من المرجح (اعتمادا على usingق) انتقل إلى طريقة ملحق 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 يجمع الأسلوب.هنا String هو دائما البيانو خيط, MyPiano.String.لا يوجد عضو (static أم لا) Format موجود عليه (أو موروث من فئته الأساسية).والقيمة "Goodbye" لا يمكن تحويلها إليه.

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

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

string هو اسم مستعار (أو اختصار) لـ System.String.يعني عن طريق الكتابة string كنا نقصد System.String.يمكنك قراءة المزيد في رابط التفكير: 'string' هو اسم مستعار/اختزال لـ System.String.

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

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

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

  • لقد رأيت عددًا من المطورين في حيرة من أمرهم، ولا يعرفون ما إذا كانوا سيستخدمونها أم لا خيطأو خيط في الكود الخاص بهم.لأنه في C# خيط (كلمة رئيسية) تعين بالضبط System.String (نوع FCL)، لا يوجد فرق ويمكن استخدام أي منهما.وبالمثل ، سمعت بعض المطورين يقولون ذلك كثافة العمليات يمثل عدد صحيح 32 بت عندما يتم تشغيل التطبيق على نظام التشغيل 32 بت ويمثل عدد صحيح 64 بت عندما يتم تشغيل التطبيق على نظام التشغيل 64 بت.هذا البيان غير صحيح تماما:في C #، ان كثافة العمليات دائما الخرائط ل System.Int32, ، وبالتالي فهو يمثل عدد صحيح 32 بت بغض النظر عن نظام التشغيل الذي يتم تشغيل الكود.إذا كان المبرمجون سيستخدمون Int32 في الكود الخاص بهم ، ثم يتم القضاء على هذا الالتباس المحتمل.

  • شركة#، طويل خرائط ل System.Int64, ولكن بلغة برمجة مختلفة طويليمكن تعيين ل كثافة العمليات16 أو Int32.في الواقع، C++/CLI لا يعالج طويل ك Int32.يمكن لأي شخص يقرأ رمز المصدر بلغة واحدة أن يسيء تفسير نية الكود بسهولة إذا تم استخدامه للبرمجة بلغة برمجة مختلفة.في الواقع، معظم اللغات لن تعالج حتى طويل ككلمة رئيسية ولن يقوم بتجميع الكود الذي يستخدمه.

  • يحتوي FCL على العديد من الأساليب التي تحتوي على أسماء أنواع كجزء من أسماء الطرق الخاصة بها.على سبيل المثال ، BinaryReader يقدم النوع طرقًا مثل قراءة منطقية, قراءةInt32, قراءة واحدة, ، وما إلى ذلك، و 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# بشكل حصري إلى نسيان أن لغات البرمجة الأخرى يمكن استخدامها مقابل CLR ، ولهذا السبب ، تزحف C# -Imms إلى رمز مكتبة الفصل.على سبيل المثال ، يتم كتابة FCL من Microsoft بشكل حصري تقريبًا في C# ، وقد قدم المطورين في فريق FCL الآن طرقًا في المكتبة مثل مجموعة مصفوفةGetLongLength, ، والذي يقوم بإرجاع كثافة العمليات64 القيمة التي هي أ طويل في C# ولكن ليس بلغات أخرى (مثل C ++/CLI).مثال آخر هو System.Linq.Enumerableعدد طويل طريقة.

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

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

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

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

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

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

أيضًا، الآن، عندما أرى "int" أو "string"، يبدو الأمر خاطئًا جدًا بالنسبة لي، وكأنني أنظر إلى كود C في السبعينيات.

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

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

ليس هناك فرق.

الكلمة الأساسية C# string خرائط لنوع .NET System.String - إنه اسم مستعار يحافظ على اصطلاحات التسمية في اللغة.

بصورة مماثلة، int خرائط ل System.Int32.

هناك اقتباس حول هذه المسألة من كتاب دانييل سوليس.

يتم تعيين جميع الأنواع المحددة مسبقًا مباشرة إلى أنواع .NET الأساسية.أسماء النوع C# (السلسلة) هي ببساطة أسماء مستعارة لأنواع .NET (السلسلة أو النظام.ضمن برنامج C# ، يجب عليك استخدام أسماء C# بدلاً من أسماء .NET.

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

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

مثال

string String = "I am a string";

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

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

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top