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


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

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

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



Answers



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

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

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

string place = "world";

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

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

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

هذا هو الأسلوب الذي تميل ميكروسوفت لاستخدامه في الأمثلة الخاصة بهم .

يبدو أن الإرشادات في هذا المجال قد تغيرت، كما ستيليكوب الآن يفرض استخدام الأسماء المستعارة 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 هو نوع قيمة، ولكن ليس نوع بدائي في كلر. النوع البدائي الوحيد الذي ليس له اسم مستعار هو System.IntPtr .

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

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

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

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

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




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

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




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

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

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




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




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




فالتيرس، لا يمكنك إنشاء الأسماء المستعارة العالمية في نمط string ، int ، وما إلى ذلك حتى الآن كما أعرف. ومع ذلك، يمكنك إجراء المزيد من التعرجات المترجمة لأنواع ومساحات الأسماء using الكلمة الرئيسية.

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

using str = System.String;
using strDict = System.Collections.Generic.Dictionary<string, string>;
//...
str s = "Now you've got another alias for string!";
var d = new strDict();

انظر هنا: استخدام التوجيه (C # مرجع)




System.String هو فئة .net سلسلة - في C # string هو اسم مستعار ل System.String - حتى في استخدامها فهي هي نفسها.

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

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




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

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




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

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

يعتبر:

String someString; 
string anotherString; 



C # هي اللغة التي يتم استخدامها جنبا إلى جنب مع كلر.

string هي نوع في C #.

System.String هو نوع في كلر.

عند استخدام C # جنبا إلى جنب مع string كلر سيتم تعيين إلى System.String .

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




يظهر هذا الفيديو على يوتوب عمليا كيف تختلف.

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

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

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

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

String s = "I am String";

أو

string s = "I am String";

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

الكائن: System.Object ، سلسلة: System.String ، بول: System.Boolean ، بايت: System.Byte ، سبيت: System.SByte ، باختصار: System.Int16 وهلم جرا

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

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

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

string s = String.ToUpper() ;



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

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




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

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




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

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




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




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




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







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




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




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

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

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

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

أيضا، الآن، عندما أرى "إنت" أو "سلسلة"، فإنه يبدو فقط خاطئ حقا بالنسبة لي، مثل أنا أنظر في كود C 1970.




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

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

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




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

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




ليس هناك فرق.

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

وبالمثل، intيعين System.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)من المحتمل (حسب usingالصورة) انتقل إلى الطريقة تمديد ينق 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"لا يمكن تحويلها إلى ذلك.




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




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

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

مثال

string String = "I am a string";

الكلمة stringهي اسم مستعار لل System.Stringوبصرف النظر عن مسألة رئيسية، وهما ما يعادل بالضبط.

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



هناك اشارة في هذه المسألة من كتاب دانيال سوليس " .

يتم تعيين جميع أنواع محددة مسبقا مباشرة إلى أنواع. NET الأساسية. أسماء C # نوع (سلسلة) هي مجرد أسماء مستعارة لأنواع صافي (سلسلة أو System.String)، وذلك باستخدام أسماء. NET يعمل بشكل جيد نحويا، على الرغم من أن هذا لا تشجع. ضمن برنامج C #، يجب عليك استخدام C # أسماء بدلا من أسماء .NET.