[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 هو نوع قيمة، ولكن ليس نوع بدائي في كلر. النوع البدائي الوحيد الذي ليس له اسم مستعار هو 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 الطبقات.

Question

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

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

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




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




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

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




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




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







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

string هي نوع في C #.

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

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

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




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

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




أفضل إجابة سمعت من قبل عن استخدام الأسماء المستعارة نوع في 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 ، 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 # مرجع)




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

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




ليس هناك فرق.

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

وبالمثل، intيعين System.Int32.




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

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

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




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




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

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