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




.net string (20)

उदाहरण ( मामले पर ध्यान दें ):

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

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

https://code.i-harness.com


6 साल और 5 महीने (शिथिलता) के बाद नया उत्तर।

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


C # एक भाषा है जिसका उपयोग CLR के साथ मिलकर किया जाता है।

string # C में एक प्रकार है।

System.String CLR में एक प्रकार है।

जब आप C # का उपयोग करते हैं तो CLR string साथ System.String मैप किया जाएगा।

सैद्धांतिक रूप से, आप एक C # -compiler लागू कर सकते हैं जो जावा बाइटकोड उत्पन्न करता है। इस संकलक का एक समझदार कार्यान्वयन शायद जावा जावा लाइब्रेरी के साथ इंटरऑपरेट करने के लिए java.lang.String को मैप करेगा।


दोनों समान हैं। लेकिन दिशानिर्देशों के कोडिंग के नजरिए से string बजाय string का उपयोग करना बेहतर है। यह वही है जो आमतौर पर डेवलपर्स उपयोग करते हैं। Int32 का उपयोग करने के बजाय उदाहरण के लिए हम int का उपयोग करते हैं जैसे कि int का उपनाम है

FYI करें "कीवर्ड स्ट्रिंग पूर्वनिर्धारित वर्ग System.String लिए केवल एक उपनाम है।" - C # भाषा विनिर्देश 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx


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

जैसा कि अन्य ने उल्लेख किया है, string System.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

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

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

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

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

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


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


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

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


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

लेकिन अब एक लंबे पाठ्य उत्तर के लिए।

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

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

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

String s = "I am String";

या

string s = "I am String";

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

ऑब्जेक्ट: System.Object , string: System.String , बूल: System.Boolean , बाइट: System.Byte , sbyte: System.SByte , short: System.Int16 और इसी तरह

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

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

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

string s = String.ToUpper() ;

string System.String लिए C # में एक उपनाम है।
इसलिए तकनीकी तौर पर, कोई अंतर नहीं है। यह int बनाम System.Int32 की तरह है।

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

जैसे

string place = "world";

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

जैसे

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

यह वह शैली है जिसका उपयोग Microsoft अपने उदाहरणों में करता है

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


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


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

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

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


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

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

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

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

StringBuilder @string = new StringBuilder();

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


string और String सभी तरीकों से समान हैं (अपरकेस "S" को छोड़कर)। कोई प्रदर्शन निहितार्थ नहीं हैं।

सिंटैक्स हाइलाइटिंग के कारण अधिकांश परियोजनाओं में लोअरकेस string को प्राथमिकता दी जाती है


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


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

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

उदाहरण

string String = "I am a string";

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

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

मैं इसे केवल रिक्शेर्स पुस्तक से उत्तर देने के लिए जोड़ना चाहूंगा:

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

  • मैंने कई डेवलपर्स को उलझन में देखा है, न जाने उनके कोड में स्ट्रिंग या स्ट्रिंग का उपयोग करने के लिए । क्योंकि C # string (एक कीवर्ड) में बिल्कुल System.String (एक FCL प्रकार) का मैप होता है , इसलिए कोई अंतर नहीं है और या तो इसका उपयोग किया जा सकता है। इसी तरह, मैंने कुछ डेवलपर्स को यह कहते सुना है कि इंट 32-बिट पूर्णांक का प्रतिनिधित्व करता है जब एप्लिकेशन 32-बिट ओएस पर चल रहा हो और यह 64-बिट पूर्णांक का प्रतिनिधित्व करता हो जब एप्लिकेशन 64-बिट ओएस पर चल रहा हो। यह कथन बिलकुल गलत है: C # में, एक int हमेशा System.Int32 के लिए मैप करता है , और इसलिए यह OS पर ध्यान दिए बिना 32-बिट पूर्णांक का प्रतिनिधित्व करता है, जिस पर कोड चल रहा है। यदि प्रोग्रामर Int32 का उपयोग करेंगे उनके कोड में, फिर इस संभावित भ्रम को भी समाप्त कर दिया जाता है।

  • C # में, System.Int64 के लिए लंबे नक्शे , लेकिन एक अलग प्रोग्रामिंग भाषा में, लंबे समय तक एक Int16 या Int32 में मैप किया जा सकता है । वास्तव में, C ++ / CLI लंबे समय तक Int32 के रूप में व्यवहार करता है । किसी एक भाषा में स्रोत कोड पढ़ने वाला आसानी से कोड के इरादे का गलत अर्थ लगा सकता है यदि वह किसी अन्य प्रोग्रामिंग भाषा में प्रोग्रामिंग के लिए उपयोग किया जाता है। वास्तव में, अधिकांश भाषाएं लंबे समय तक एक कीवर्ड के रूप में व्यवहार नहीं करेंगी और कोड का उपयोग नहीं करेंगी।

  • एफसीएल के पास कई विधियां हैं जिनके नाम उनके विधि नामों के भाग के रूप में हैं। उदाहरण के लिए, BinaryReader प्रकार ReadBoolean , ReadInt32 , ReadSingle , और इसी तरह के तरीके प्रदान करता है , और System.Convert प्रकार ToBoolean , ToInt32 , ToSlele , और इतने पर जैसे तरीके प्रदान करता है । हालांकि यह निम्नलिखित कोड लिखने के लिए कानूनी है, फ्लोट के साथ लाइन मेरे लिए बहुत अप्राकृतिक लगती है, और यह स्पष्ट नहीं है कि लाइन सही है:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
  • कई प्रोग्रामर जो C # का विशेष रूप से उपयोग करते हैं, वे यह भूल जाते हैं कि अन्य प्रोग्रामिंग भाषाओं का उपयोग CLR के विरुद्ध किया जा सकता है, और इस वजह से C # -ism वर्ग लाइब्रेरी कोड में रेंगता है। उदाहरण के लिए, Microsoft की FCL लगभग विशेष रूप से C # में लिखी गई है और FCL टीम के डेवलपर्स ने अब लाइब्रेरी में तरीके पेश किए हैं जैसे कि Array का GetLongLength , जो एक Int64 मान लौटाता है जो C # में लंबा है लेकिन अन्य भाषाओं में नहीं है (जैसे C ++ / CLI)। एक और उदाहरण System.Linq.Enumerable का LongCount तरीका है।

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


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


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


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


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

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


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






alias