type - ما الفرق بين السلسلة والسلسلة في C#؟
size of data types in c# (20)
C # هي لغة يتم استخدامها مع CLR.
هو نوع في C #.
System.String
هو نوع في CLR.
عند استخدام C # مع string
CLR سيتم تعيينها إلى System.String
.
من الناحية النظرية ، يمكنك تنفيذ مترجم C # الذي أنشأ جافا bytecode. من المحتمل أن يقوم التنفيذ المعقول لهذا المترجم java.lang.String
string
إلى java.lang.String
لكي يتفاعل مع مكتبة وقت التشغيل Java.
مثال ( لاحظ الحالة ):
string s = "Hello world!";
String s = "Hello world!";
ما هي المبادئ التوجيهية لاستخدام كل منها؟ وما هي الاختلافات ؟
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)
المحتمل أن يكون النطق (حسب using
s) هو الذهاب إلى طريقة تمديد 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
.