c# - सी#में स्ट्रिंग और स्ट्रिंग के बीच क्या अंतर है?




.net string types alias (25)

स्ट्रिंग ( System.String ) बेस क्लास लाइब्रेरी में एक कक्षा है। स्ट्रिंग (लोअर केस) सी # में एक आरक्षित काम है जो System.String के लिए उपनाम है। Int32 बनाम int एक समान स्थिति है जैसे Boolean vs. bool । ये सी # भाषा विशिष्ट कीवर्ड आपको सी के समान शैली में प्राइमेटिव घोषित करने में सक्षम बनाता है।

उदाहरण ( मामले को नोट करें ):

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

प्रत्येक के उपयोग के लिए दिशानिर्देश क्या हैं? और मतभेद क्या हैं?


अन्य प्रोग्रामर के बीच सामान्य प्रैक्टिस के विपरीत, मैं String पर string पसंद करता हूं, इस तथ्य को हाइलाइट करने के लिए कि String एक संदर्भ प्रकार है, जैसा कि जॉन स्कीट ने उल्लेख किया था।


स्ट्रिंग एक कीवर्ड है, और आप एक पहचानकर्ता के रूप में स्ट्रिंग का उपयोग नहीं कर सकते हैं।

स्ट्रिंग एक कीवर्ड नहीं है, और आप इसे पहचानकर्ता के रूप में उपयोग कर सकते हैं:

उदाहरण

string String = "I am a string";

कीवर्ड कीवर्ड समस्या से अलग के stringलिए एक उपनाम है System.String, दोनों बिल्कुल बराबर हैं।

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

यह वास्तव में सम्मेलन का मामला है। stringबस सी / सी ++ शैली की तरह दिखता है। सामान्य सम्मेलन आपके चुने हुए भाषा द्वारा प्रदान किए गए शॉर्टकट का उपयोग करना है (int / int for Int32)। यह "ऑब्जेक्ट" के लिए भी जाता है decimal

सैद्धांतिक रूप से यह कुछ भविष्य में 64-बिट मानक में पोर्ट कोड में मदद कर सकता है जिसमें "int" का अर्थ हो सकता है Int64, लेकिन यह बात नहीं है, और मैं उम्मीद करता हूं कि किसी अपग्रेड विज़ार्ड को किसी भी intसंदर्भ को किसी भी संदर्भ में बदलने के Int32लिए सुरक्षित रहें।


string System.String लिए सिर्फ एक उपनाम है। string । कंपाइलर उन्हें समान रूप से इलाज करेगा।

जैसा कि आप उल्लेख करते हैं, सिंटैक्स हाइलाइटिंग का एकमात्र व्यावहारिक अंतर है, और यदि आप String उपयोग करते हैं तो आपको using System लिखना होगा।


दोनों के बीच कोई अंतर नहीं है - stringहालांकि, अन्य डेवलपर्स के स्रोत कोड पर विचार करते समय, पसंदीदा विकल्प प्रतीत होता है।


String System.String के लिए खड़ा है। String और यह एक .NET फ्रेमवर्क प्रकार है। string सिस्टम के लिए सी # भाषा में एक उपनाम है। string । उनमें से दोनों को System.String में संकलित किया गया है । आईएल (इंटरमीडिएट भाषा) में System.String , इसलिए कोई फर्क नहीं पड़ता। चुनें कि आप क्या पसंद करते हैं और इसका उपयोग करें। यदि आप सी # में कोड करते हैं, तो मैं string पसंद करूंगा क्योंकि यह एक सी # प्रकार उपनाम है और सी # प्रोग्रामर द्वारा प्रसिद्ध है।

मैं वही कह सकता हूं ( int , System.Int32 ) आदि ..


6 साल और 5 महीने (विलंब) के बाद नया जवाब।

जबकि stringएक आरक्षित सी # कीवर्ड है जो हमेशा एक निश्चित अर्थ है, 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हमेशा एक पियानो है string , MyPiano.String। इस पर कोई सदस्य ( staticया नहीं) Formatमौजूद है (या इसके आधार वर्ग से विरासत में मिला है)। और मूल्य "Goodbye"इसमें परिवर्तित नहीं किया जा सकता है।


String एक कीवर्ड नहीं है और इसे पहचानकर्ता के रूप में उपयोग किया जा सकता है जबकि string एक कीवर्ड है और इसे पहचानकर्ता के रूप में उपयोग नहीं किया जा सकता है। और कार्य बिंदु के दृष्टिकोण में दोनों समान हैं।


System.String लिए लोअर केस string एक उपनाम है। string । वे C# में समान हैं।

इस पर बहस है कि आपको सिस्टम प्रकार ( System.Int32 , System.String , आदि) प्रकार या C# aliases ( int , string , आदि) का उपयोग करना चाहिए या नहीं। मैं व्यक्तिगत रूप से मानता हूं कि आपको C# aliases उपयोग करना चाहिए, लेकिन यह सिर्फ मेरी निजी वरीयता है।


मैं इसे रिचर्स पुस्तक से, lfousts उत्तर में जोड़ना चाहता हूं:

सी # भाषा विनिर्देश कहता है, "शैली के मामले में, कीवर्ड का उपयोग पूर्ण सिस्टम प्रकार के नाम के उपयोग के पक्ष में है।" मैं भाषा विनिर्देश से असहमत हूं; मैं एफसीएल प्रकार के नामों का उपयोग करना पसंद करता हूं और पूरी तरह से आदिम प्रकार के नामों से बचता हूं। असल में, मेरी इच्छा है कि कंपेलरों ने आदिम प्रकार के नामों और मजबूर डेवलपर्स को एफसीएल प्रकार के नामों का उपयोग करने की पेशकश भी नहीं की है। मेरे कारण यहां दिए गए हैं:

पूरा अनुच्छेद पढ़ने से पहले मुझे उनकी राय नहीं मिली।


सिस्टम प्रकारों का उपयोग करना सी # और वीबी.Net के बीच पोर्ट करना आसान बनाता है, अगर आप उस तरह की चीज में हैं।


यह ऊपर कवर किया गया है; हालांकि, आप प्रतिबिंब में string का उपयोग नहीं कर सकते हैं; आपको String उपयोग करना होगा।


string System.String लिए सी # में एक उपनाम है। string
तो तकनीकी रूप से, कोई फर्क नहीं पड़ता। यह int बनाम System.Int32 की तरह है।

जहां तक ​​दिशानिर्देश हैं, किसी भी समय जब आप ऑब्जेक्ट का जिक्र कर रहे हों तो आमतौर पर string का उपयोग करने की अनुशंसा की जाती है।

जैसे

string place = "world";

इसी प्रकार, मुझे लगता है कि यदि आपको विशेष रूप से कक्षा में संदर्भित करने की आवश्यकता है तो आमतौर पर String का उपयोग करने की अनुशंसा की जाती है।

जैसे

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

यह वह शैली है जिसे माइक्रोसॉफ्ट अपने उदाहरणों में उपयोग करता है।

ऐसा प्रतीत होता है कि इस क्षेत्र में मार्गदर्शन बदल सकता है, क्योंकि StyleCop अब सी # विशिष्ट उपनामों के उपयोग को लागू करता है।



string एक आरक्षित शब्द है, लेकिन String सिर्फ एक वर्ग का नाम है। इसका मतलब है कि string को एक वैरिएबल नाम के रूप में इस्तेमाल नहीं किया जा सकता है।

अगर किसी कारण से आप स्ट्रिंग नामक एक चर चाहते थे, तो आप इन संकलनों में से केवल पहले देखेंगे:

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

यदि आप वास्तव में स्ट्रिंग नामक एक चर नाम चाहते हैं तो आप @ उपसर्ग के रूप में उपयोग कर सकते हैं:

StringBuilder @string = new StringBuilder();

एक और महत्वपूर्ण अंतर: स्टैक ओवरफ़्लो उन्हें अलग-अलग हाइलाइट करता है।


System.String .NET स्ट्रिंग क्लास है - C # string में System.String लिए उपनाम है - इसलिए उपयोग में वे समान हैं।

दिशानिर्देशों के लिए मैं बहुत परेशान नहीं होता हूं और जो कुछ भी आपको लगता है उसका उपयोग करें - जीवन में और भी महत्वपूर्ण चीजें हैं और कोड वैसे भी वही होगा।

यदि आप स्वयं को ऐसे सिस्टम बनाते हैं जहां आप उपयोग कर रहे पूर्णांक के आकार को निर्दिष्ट करना आवश्यक है और इसलिए Int16 , Int32 , UInt16 , UInt32 आदि का उपयोग करना चाहते हैं तो String का उपयोग करने के लिए यह और अधिक प्राकृतिक लग सकता है - और अलग-अलग के बीच घूमते समय .NET भाषाओं से यह चीजों को और अधिक समझने योग्य बना सकता है - अन्यथा मैं स्ट्रिंग और int का उपयोग करूंगा।


एक अंतर है - आप using System; बिना String उपयोग नहीं कर सकते using System; पहले से।


यह यूट्यूब वीडियो व्यावहारिक रूप से प्रदर्शित करता है कि वे कैसे भिन्न होते हैं।

लेकिन अब एक लंबे पाठ के जवाब के लिए।

जब हम .NET बारे में बात करते हैं तो दो अलग-अलग चीजें होती हैं जिनमें एक .NET ढांचा होता है और दूसरी भाषाएं होती हैं ( C# , VB.NET आदि) जो उस ढांचे का उपयोग करती हैं।

" System.String " उर्फ ​​"स्ट्रिंग" (पूंजी "एस") एक .NET फ्रेमवर्क डेटा प्रकार है जबकि "स्ट्रिंग" एक C# डेटा प्रकार है।

संक्षेप में "स्ट्रिंग" एक उपनाम ("स्ट्रिंग" के अलग-अलग नामों के साथ कहा जाता है)। तो तकनीकी रूप से नीचे दिए गए कोड कथन दोनों एक ही आउटपुट देंगे।

String s = "I am String";

या

string s = "I am String";

इसी तरह नीचे दिखाए गए अनुसार अन्य सी # डेटा प्रकार के लिए उपनाम हैं: -

ऑब्जेक्ट: System.Object ऑब्जेक्ट, स्ट्रिंग: System.Object । स्ट्रिंग, बूल: सिस्टम। बुलीयन, बाइट: सिस्टम। बाइट, एसबीटीई: सिस्टम। बाइट, लघु: सिस्टम.इन्ट 16 और इसी तरह

अब प्रोग्रामर के दृष्टिकोण से मिलियन डॉलर का सवाल तो "स्ट्रिंग" और "स्ट्रिंग" का उपयोग कब करें?

भ्रम से बचने के लिए पहली बात लगातार उनमें से एक का उपयोग करें। लेकिन जब आप परिवर्तनीय घोषणा करते हैं तो सर्वोत्तम प्रथाओं से परिप्रेक्ष्य से "स्ट्रिंग" (छोटे "एस") का उपयोग करना अच्छा होता है और जब आप इसे कक्षा के नाम के रूप में उपयोग कर रहे हैं तो "स्ट्रिंग" (पूंजी "एस") को प्राथमिकता दी जाती है।

नीचे दिए गए कोड में बाएं हाथ की तरफ एक परिवर्तनीय घोषणा है और इसे "स्ट्रिंग" का उपयोग करके घोषित किया गया है। दायीं तरफ हम एक विधि बुला रहे हैं इसलिए "स्ट्रिंग" अधिक समझदार है।

string s = String.ToUpper() ;

इसमें कोई फर्क नही है।

सी # कीवर्ड stringनक्शे .NET प्रकार के लिए System.String- यह एक उपनाम है जो भाषा के नामकरण सम्मेलनों में रहता है।

इसी तरह, intनक्शे के लिए System.Int32


जैसा कि अन्य लोग कह रहे हैं, वे वही हैं। स्टाइलकॉप नियम, डिफ़ॉल्ट रूप से, string का उपयोग करने के लिए आपको सी # कोड शैली के सर्वोत्तम अभ्यास के रूप में उपयोग करने के लिए लागू करेंगे, सिवाय इसके कि सिस्टम को संदर्भित करते समय। string , String.Join , String.Concat , आदि जैसे स्थिर फ़ंक्शंस ...


सिर्फ पूर्णता के लिए, यहां संबंधित जानकारी का मस्तिष्क डंप है ...

जैसा कि अन्य ने नोट किया है, string System.String लिए एक उपनाम है। string । वे एक ही कोड को संकलित करते हैं, इसलिए निष्पादन समय पर कोई अंतर नहीं होता है। यह सी # में उपनामों में से एक है। पूरी सूची है:

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

Spec में, मान प्रकार उपनाम "सरल प्रकार" के रूप में जाना जाता है। प्रत्येक साधारण प्रकार के निरंतर मूल्यों के लिए साहित्य का उपयोग किया जा सकता है; कोई अन्य मूल्य प्रकार के शाब्दिक रूप उपलब्ध नहीं हैं। (वीबी के साथ इसकी तुलना करें, जो DateTime अक्षरों की अनुमति देता है, और इसके लिए भी उपनाम है।)

एक परिस्थिति है जिसमें आपको उपनामों का उपयोग करना होता है: जब एक enum के अंतर्निहित प्रकार को स्पष्ट रूप से निर्दिष्ट करते हैं। उदाहरण के लिए:

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

यह सिर्फ एक बात है कि spec enum घोषणाओं को परिभाषित करता है - कोलन के बाद हिस्सा अभिन्न प्रकार का उत्पादन होना चाहिए, जो कि sbyte , byte , short , ushort , int , uint , long , ulong , char का एक टोकन है। .. उदाहरण के लिए परिवर्तनीय घोषणाओं द्वारा उपयोग किए जाने वाले प्रकार के उत्पादन के विपरीत। यह किसी भी अन्य अंतर का संकेत नहीं देता है।

अंत में, जब इसका उपयोग करने की बात आती है: व्यक्तिगत रूप से मैं कार्यान्वयन के लिए हर जगह उपनाम का उपयोग करता हूं, लेकिन किसी भी एपीआई के लिए सीएलआर प्रकार का उपयोग करता हूं। यह वास्तव में बहुत अधिक मायने रखता नहीं है जो आप कार्यान्वयन के मामले में उपयोग करते हैं - आपकी टीम के बीच स्थिरता अच्छी है, लेकिन कोई और देखभाल करने वाला नहीं है। दूसरी ओर, यह वास्तव में महत्वपूर्ण है कि यदि आप एक एपीआई में एक प्रकार का संदर्भ देते हैं, तो आप एक भाषा तटस्थ तरीके से ऐसा करते हैं। ReadInt32 नामक एक विधि स्पष्ट है, जबकि ReadInt नामक एक विधि को व्याख्या की आवश्यकता होती है। कॉलर एक ऐसी भाषा का उपयोग कर सकता है जो उदाहरण के लिए Int16 लिए एक int उपनाम परिभाषित करता है। .NET फ्रेमवर्क डिजाइनरों ने इस पैटर्न का पालन किया है, BitConverter , BinaryReader और Convert क्लास में अच्छे उदाहरण हैं।


सी # में प्रदत्त प्रकार उपनामों का उपयोग करने के बारे में मैंने कभी भी सबसे अच्छा जवाब सुना है, जेफरी रिचटर से उनकी पुस्तक सीएलआर वाया सी # में आता है । यहां उनके 3 कारण हैं:

  • मैंने कई डेवलपर्स को उलझन में देखा है, यह नहीं जानते कि उनके कोड में स्ट्रिंग या स्ट्रिंग का उपयोग करना है या नहीं। चूंकि सी # स्ट्रिंग (एक कीवर्ड) मानचित्र में बिल्कुल सिस्टम। स्ट्रिंग (एक एफसीएल प्रकार) में कोई अंतर नहीं होता है और इसका उपयोग भी किया जा सकता है।
  • सी # में, लंबे नक्शे को System.Int64 पर , लेकिन एक अलग प्रोग्रामिंग भाषा में, लंबे समय तक Int16 या Int32 पर नक्शा लगा सकता है। वास्तव में, सी ++ / सीएलआई वास्तव में एक इंट 32 के रूप में लंबे समय तक इलाज करता है। एक भाषा में कोई भी स्रोत कोड पढ़ने से कोड के इरादे को आसानी से गलत तरीके से परिभाषित किया जा सकता है यदि उसे किसी अन्य प्रोग्रामिंग भाषा में प्रोग्रामिंग के लिए उपयोग किया जाता है। वास्तव में, अधिकांश भाषाएं एक कीवर्ड के रूप में लंबे समय तक भी इलाज नहीं करतीं और इसका उपयोग करने वाले कोड को संकलित नहीं करतीं।
  • एफसीएल में कई विधियां हैं जिनके प्रकार के नाम उनके विधि नामों के हिस्से के रूप में हैं। उदाहरण के लिए, 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

इसलिए यह अब आपके पास है। मुझे लगता है कि ये सभी वास्तव में अच्छे अंक हैं। हालांकि, मुझे अपने कोड में जेफरी की सलाह का उपयोग करके खुद को नहीं मिला। हो सकता है कि मैं अपने सी # दुनिया में भी फंस गया हूं लेकिन मैं अपना कोड फ्रेमवर्क कोड की तरह दिखने की कोशिश कर रहा हूं।


मैं स्वरूपण कारणों के लिए पूंजीकृत .NET प्रकार (उपनामों के बजाए) पसंद करते हैं। .NET प्रकार अन्य ऑब्जेक्ट प्रकारों के समान रंग होते हैं (मान प्रकार उचित वस्तुएं हैं, आखिरकार)।

सशर्त और नियंत्रण कीवर्ड (जैसे, switch , और return ) लोअरकेस और रंगीन गहरे नीले रंग (डिफ़ॉल्ट रूप से) हैं। और मैं उपयोग और प्रारूप में असहमति नहीं होगी।

विचार करें:

String someString; 
string anotherString; 

ध्यान दें कि फ़ंक्शन केवल STRING ऑब्जेक्ट्स पर काम करेगा।

उदाहरण के लिए, मैं एक प्लगइन का उपभोग कर रहा था, और उलझन में था कि मुझे "एक्सटेंशन.tolowercase एक फ़ंक्शन नहीं है" जेएस त्रुटि क्यों मिल रही थी।

 onChange: function(file, extension)
    {
      alert("extension.toLowerCase()=>" + extension.toLowerCase() + "<=");

जिसने त्रुटि उत्पन्न की "extension.toLowerCase एक फ़ंक्शन नहीं है" इसलिए मैंने कोड के इस टुकड़े को आजमाया, जिसने समस्या का खुलासा किया!

alert("(typeof extension)=>" + (typeof extension) + "<=");;

आउटपुट "(टाइपो एक्सटेंशन) => ऑब्जेक्ट <=" - इसलिए अहहा, मुझे अपने इनपुट के लिए स्ट्रिंग var नहीं मिल रहा था। फिक्स सीधे आगे है - बस एक स्ट्रिंग में डर्न चीज को मजबूर करें !:

var extension = String(extension);

कलाकार के बाद, एक्सटेंशन .toLowerCase () फ़ंक्शन ठीक काम करता है।







c# .net string types alias