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




string types alias (25)

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

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

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


Answers

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

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

مثال

string String = "I am a string";

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

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

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


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 . سوف يعاملهم المترجم بشكل متماثل.

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


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


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

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

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

string place = "world";

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

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

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

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

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


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

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

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


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

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

يعتبر:

String someString; 
string anotherString; 

هناك اقتباس عن هذا الموضوع من كتاب دانيال سوليس .

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


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


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


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


ليس هناك فرق.

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

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


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

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


إجابة جديدة بعد 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"يمكن تحويل القيمة إليه.


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

هو نوع في C #.

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

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

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


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

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


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


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

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


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

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

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

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

StringBuilder @string = new StringBuilder();

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


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


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


System.String هو فئة سلسلة. NET - في string C # هو اسم مستعار لـ System.String - لذا فهي في نفس الحالة.

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

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


لقد تدحرجت بلدي باستخدام strtok واستخدام دفعة لتقسيم سلسلة. أفضل طريقة لقد وجدت هي مكتبة مجموعة الأدوات C ++ string . انها مرنة بشكل لا يصدق وسريع.

#include <iostream>
#include <vector>
#include <string>
#include <strtk.hpp>

const char *whitespace  = " \t\r\n\f";
const char *whitespace_and_punctuation  = " \t\r\n\f;,=";

int main()
{
    {   // normal parsing of a string into a vector of strings
        std::string s("Somewhere down the road");
        std::vector<std::string> result;
        if( strtk::parse( s, whitespace, result ) )
        {
            for(size_t i = 0; i < result.size(); ++i )
                std::cout << result[i] << std::endl;
        }
    }

    {  // parsing a string into a vector of floats with other separators
        // besides spaces

        std::string s("3.0, 3.14; 4.0");
        std::vector<float> values;
        if( strtk::parse( s, whitespace_and_punctuation, values ) )
        {
            for(size_t i = 0; i < values.size(); ++i )
                std::cout << values[i] << std::endl;
        }
    }

    {  // parsing a string into specific variables

        std::string s("angle = 45; radius = 9.9");
        std::string w1, w2;
        float v1, v2;
        if( strtk::parse( s, whitespace_and_punctuation, w1, v1, w2, v2) )
        {
            std::cout << "word " << w1 << ", value " << v1 << std::endl;
            std::cout << "word " << w2 << ", value " << v2 << std::endl;
        }
    }

    return 0;
}

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





c# .net string types alias