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


6504

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

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

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


72
@ORMapper, लेकिन तथ्य यह है कि C # व्याकरणstring का एक शाब्दिक निर्माण है जबकि सिर्फ एक प्रकार है। किसी भी अनुमान में स्पष्ट अंतर के बावजूद , अभी भी यह अंतर्निहित अंतर है जिसे कुछ अस्पष्टता के साथ जोड़ा जा सकता है। भाषा को इस तरह से समर्थन करना चाहिए कि कार्यान्वयन BCL में किसी विशेष वर्ग के लिए विचार करने के लिए इतना (काफी) बाध्य नहीं है। System.Stringstring
किर्क वोल

106
@KirkWoll: भाषा विनिर्देश के अनुसार, खुद को भाषा चाहिए पर विचार stringबीसीएल प्रकार के रूप में बिल्कुल वैसा ही होना करने के लिए System.String, और कुछ नहीं। यह बिल्कुल अस्पष्ट नहीं है। बेशक, आप सी # व्याकरण का उपयोग करके अपने स्वयं के कंपाइलर को लागू कर सकते हैं, और इस तरह के पाए गए सभी टोकन का उपयोग कर सकते हैं, जो मनमाने ढंग से सी # भाषा विनिर्देश में परिभाषित किए गए हैं। हालाँकि, परिणामी भाषा केवल C # लुकलाइक होगी, इसे C # नहीं माना जा सकता है।
या मैपर

88
आप stringसिस्टम के लिए एक निर्देश का उपयोग किए बिना उपयोग कर सकते हैं । आप ऐसा नहीं कर सकते String
विल्सू

14
अल्गोल और फोरट्रान से आने वाले किसी व्यक्ति के लिए, इस चर्चा से पता चलता है कि कुछ गड़बड़ है string। संक्षिप्त करने की आवश्यकता है System.String, लेकिन, एक उपनाम के रूप में, यह काफी पसंद है, लेकिन बिल्कुल एक ही चीज नहीं है। सी # के कई वर्षों के बाद, हालांकि, मैं कहना चाहता हूँ, यह बस का उपयोग करने के लिए सुरक्षित है stringऔर string.Format()और के बारे में चिंता करने के लिए नहीं System.String
रोलैंड

8
@ संगीता आप क्या कह रही हैं? System.Stringवर्ग अभी भी वहाँ है, और stringकीवर्ड अभी भी इसके लिए एक उपनाम है। ऐसे ही System.Int32और int। वे वस्तुतः एक ही चीज हैं।
क्रेग

जवाबों:


6102

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

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

जैसे

string place = "world";

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

जैसे

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

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

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


163
यदि आप स्टाइलकॉप का उपयोग करने का निर्णय लेते हैं और इसका पालन करते हैं, तो यह भाषा के लिए विशिष्ट प्रकारों का उपयोग करने के लिए कहेगा। इसलिए C # के लिए आपके पास स्ट्रिंग (बजाय स्ट्रिंग), int (Int32 के बजाय), फ्लोट (सिंगल के बजाय) - stylecop.soyuz5.com/SA1121.html
डोमिनिक ज़ुकिएविच

144
मैं हमेशा उपनामों का उपयोग करता हूं क्योंकि मैंने एक दिन मान लिया है कि यह काम में आ सकता है क्योंकि वे एक अमूर्त के रूप में काम कर रहे हैं, इसलिए इसलिए उनके कार्यान्वयन मेरे बिना बदल सकते हैं।
रोब

37
Visual Studio 2015 का कहना है कि String.Format को string में बदलना चाहिए ।ormat, इसलिए मुझे लगता है कि Microsoft इस तरह जा रहा है। मैंने हमेशा स्टैटिक विधियों के लिए स्ट्रिंग का उपयोग किया है।
सामी कुहोमेन

32
जैसा कि मैंने इनके माध्यम से पढ़ा है कि मैंने देखा है कि कई टिप्पणियां केवल गलत हैं। @ DRAirey1 समय के साथ, आप पाएंगे कि पुराना तरीका अभी भी सबसे अच्छा है, अगर आपको संदेह है कि फिर मैं आपको विज़ुअल स्टूडियो का उपयोग किए बिना C # कोड लिखने की कोशिश करने की हिम्मत करता हूं। यह लगभग असंभव है और एक ऐसी स्थिति है जो वेब विकास कार्यों में समय-समय पर सामने आती है। @ Vlad आपको स्ट्रिंग का उपयोग करने के लिए कुछ भी आयात करने की आवश्यकता नहीं है। @ आभी आपकी टिप्पणी व्यर्थ है और उतनी ही सच है string.Format()। @KlitosG नहीं, यह सच नहीं है। वे सभी बिल्कुल समान काम करते हैं।
krowe2

46
क्या आप एक टिप्पणी जोड़ सकते हैं कि वास्तव में, एक अंतर है? उदाहरण के लिए: nameof(string)जबकि संकलन नहीं nameof(String)होगा।
जीरोने वेनवेल

3439

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

जैसा कि दूसरों ने उल्लेख किया है, के 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

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

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


82
एनम के साथ विरासत की स्थिति दिलचस्प है। क्या आप दस्तावेज़ीकरण की ओर इशारा कर सकते हैं कि क्यों उपनामों का उपयोग किया जाना चाहिए? या यह एक ज्ञात बग है?
JaredPar

149
यह खंड 14.1 की युक्ति है (मैं यहां आसानी से उद्धृत नहीं कर सकता क्योंकि यह बहुत लंबा है)। यह स्पष्ट रूप से नहीं कहा गया है कि आपको उपनाम का उपयोग करने के लिए मिला है, लेकिन उपनाम अपने प्रकार के रूप में माना जाता है। यह सब थोड़ा अजीब है।
जॉन स्कीट

32
@PiPeep जो अपवोट्स की बड़ी राशि से अधिक आश्चर्यजनक है, वह डाउनवोट्स की कंपित कम मात्रा है (शीर्ष 5 पदों पर कुल 2000 से अधिक अपवोट्स हैं, और फिर भी उन सभी के बीच केवल 1 डाउनवोट है)। खासकर जब आप इस धारणा में फैक्टर रखते हैं कि किसी भी समुदाय में हमेशा "नफरत" होती है, तो मुझे लगता है कि बस अविश्वसनीय है।
corsiKa

40
के बीच एक दिलचस्प अंतर stringऔर Stringवह यह है कि string' is a keyword in c#, so you can not use it as a variable name.For Ex: स्ट्रिंग स्ट्रिंग = "हाय"; //compiler error, but स्ट्रिंग स्ट्रिंग = "हाय"; `स्वीकार्य है, जैसा Stringकि एक पहचान है एक कीवर्ड नहीं है।
संजीव राय

33
@ संजीवराई: हाँ। आप @stringएक पहचानकर्ता बनाने के लिए उपयोग कर सकते हैं जो stringयद्यपि समाप्त होता है । यह एक तरह से भागने का तंत्र है।
जॉन स्कीट

715

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

मैं ( int, System.Int32) आदि के बारे में भी यही कह सकता हूं ।


3
यदि आप C # में कोड रखते हैं, तो मैं स्ट्रिंग को प्राथमिकता दूंगा क्योंकि यह C # प्रकार का उपनाम है और C # प्रोग्रामर्स द्वारा जाना जाता है - जब C # व्यक्ति .NET फ्रेमवर्क नहीं जानता होगा। +1 जैसा कि मुझे लगता है कि आमतौर पर यह सबसे अच्छा जवाब है, लेकिन मैं जिस बिंदु का उल्लेख करता हूं वह अजीब लगता है।
MyDaftQuestions

4
मैं व्यक्तिगत रूप से "Int32" का उपयोग करना पसंद करता हूं, क्योंकि यह तुरंत मूल्य की सीमा दिखाता है। कल्पना कीजिए कि अगर उन्होंने बाद के उच्च-बिट सिस्टम पर "int" के प्रकार को अपग्रेड किया। c में 'int' को स्पष्ट रूप से "पूर्णांक प्रकार जिसे लक्ष्य प्रोसेसर सबसे अधिक कुशल है" के रूप में देखा जाता है , और इसे "कम से कम 16 बिट" के रूप में परिभाषित किया जाता है। मैं वहाँ पूर्वानुमान लगाने योग्य संगतता पसंद करता हूँ, बहुत बहुत धन्यवाद।
Nyerguds

2
@ मायडाउटक्वेस्ट I कॉनुर। अगर कुछ भी समझ में आता है तो .net प्रकारों का लगातार उपयोग करना क्योंकि वे भाषा से अनभिज्ञ हैं और प्रकार स्पष्ट है, किसी भी भाषा से स्वतंत्र है (क्या मुझे F # के सभी या VB के आइडिओसिंक के बारे में पता है?)।
पीटर - मोनिका

5
@Nyerguds इसके बारे में चिंता न करने के दो कारण हैं। एक यह है कि intहार्डवेयर की परवाह किए बिना 32 बिट पूर्णांक के रूप में सी # भाषा कल्पना में परिभाषित किया गया है। सी #, समय की झीलों में एक साझा विरासत के बावजूद, वास्तव में सी नहीं है। int64 बिट पूर्णांक में बदलना विनिर्देश और भाषा में एक ब्रेकिंग परिवर्तन होगा। इसे फिर से परिभाषित करने की भी आवश्यकता होगी long, क्योंकि longवर्तमान में 64 बिट पूर्णांक है। चिंता न करने का दूसरा कारण अप्रासंगिक है क्योंकि प्रकार कभी नहीं बदलेंगे, लेकिन .NET केवल इतना सार है कि 99% समय आपको इसके बारे में वैसे भी सोचने की ज़रूरत नहीं है। ;-)
क्रेग

5
मैं पुराने मालिकाना खेल प्रारूपों के बहुत सारे में खुदाई @Craig मैं कहाँ है कि हर समय के बारे में सोचना है, हालांकि। और फिर का उपयोग कर Int16, Int32और Int64एक है बहुत कुछ नहीं बल्कि nondescriptive का उपयोग करने से कोड में अधिक पारदर्शी short, intऔरlong
Nyerguds

504

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

  • मैंने कई डेवलपर्स को उलझन में देखा है, न जाने उनके कोड में स्ट्रिंग या स्ट्रिंग का उपयोग करने के लिए । क्योंकि C # में स्ट्रिंग (एक कीवर्ड) System.String (एक एफसीएल प्रकार) के बिल्कुल नक्शे में है, कोई अंतर नहीं है और या तो इसका उपयोग किया जा सकता है।
  • 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 # दुनिया में फंस गया हूं, लेकिन मैं अपने कोड को फ्रेमवर्क कोड की तरह बनाने की कोशिश कर रहा हूं।


24
दूसरा बिंदु वास्तव में उपयोग करने के लिए एक कारण की तरह लगता है string, intआदि
MauganRa

15
@MauganRa और यह माना जाता है, पुस्तक के लेखक उन कारणों को सूचीबद्ध करते हैं कि वह उपनाम का उपयोग क्यों नहीं करता है
tomi.lee.jones

31
"यदि कोई C # स्रोत कोड पढ़ रहा है, तो उन्हें भाषा की युक्ति के अनुसार लंबी व्याख्या करनी चाहिए, अन्य भाषाओं की कल्पना नहीं।" वह बात पूरी तरह से याद आती है। ऐसा नहीं है कि किसी को भी कोड की गलत व्याख्या करने का इरादा है, यह किसी के मस्तिष्क के लिए गलत निष्कर्ष पर पहुंचना आसान है, जब एक प्रकार का अर्थ किसी अन्य संदर्भ में दैनिक आधार पर देखा जाता है। हम सब गलतियाँ करते हैं; स्पष्ट रूप से नामित प्रकारों का उपयोग करने से उन गलतियों की संभावना कम हो जाती है।
डैरिल

10
+ इन कारणों ने मामले पर मेरी भावनाओं को व्यक्त किया। जब मैंने पहली बार C # में कोडिंग शुरू की थी (जावा / C ++ / C बैकग्राउंड से आने वाली) तो मुझे लगा कि एलियास बदसूरत थे। मुझे अभी भी ऐसा लगता है, दुर्भाग्य से दुनिया के अधिकांश लोग मुझसे सहमत नहीं हैं, या वे परवाह नहीं करते हैं, और इसलिए लोअरकेस का उपयोग करें।
गूसगोर्मन

8
@jinzai सवाल सी # के बारे में है, जिसमें longएक हस्ताक्षरित 64-बिट पूर्णांक के रूप में परिभाषित किया गया है, चाहे प्लेटफ़ॉर्म या कंपाइलर की परवाह किए बिना। तो कुछ मामलों में, कम से कम, हाँ, यह भाषा पर निर्भर करता है
14

455

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

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

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

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

StringBuilder @string = new StringBuilder();

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


20
ध्यान रखें कि स्थानीय कॉलिंग @stringवास्तव में व्यर्थ है, क्योंकि स्थानीय लोगों के नाम केवल पीडीबी में मौजूद हैं। के रूप में अच्छी तरह से यह _stringया कुछ और कॉल कर सकते हैं। यह उन चीजों के लिए अधिक मायने रखता है जिनके नाम प्रतिबिंब के माध्यम से सुलभ हैं, जहां एक @stringसदस्य का नाम होगा "string"
रोमन स्टार्कोव

25
एक आरक्षित शब्द का उपयोग करते हुए भी ध्यान रखें कि एक चर नाम स्थूल रूप से असभ्य है।
एल्टन

7
ओपी स्ट्रिंग या स्ट्रिंग को एक चर नाम के रूप में उपयोग नहीं करना चाहता है। उन्होंने इन प्रकारों के बीच के अंतर का स्पष्टीकरण मांगा । आपका उत्तर केवल अधिक भ्रम जोड़ने के लिए कार्य करता है IMO
मैट विल्को

1
@ क्रेग अगर आप लोगों को गांठ बांधने के तरीके सिखाने के लिए सॉफ्टवेयर लिख रहे थे?
सिमोन_विवर

5
@Simon_Weaver तार में गाँठ? हा हा बड़िया। :-) बेशक, आप एक वैकल्पिक नाम चुन सकते हैं, जैसे धागा। एक मिनट रुको ... डी'ओह!
क्रेग

391

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


14
डिफ़ॉल्ट रूप से अधिकांश लोग इसे किसी भी तरह से फ़ाइल के शीर्ष पर जोड़ते हैं। वीएस डिफ़ॉल्ट रूप से सभी मामलों के अधिकांश मामलों में ऐसा करता है!
IbrarMumtaz

9
डिफ़ॉल्ट रूप से मुझे केवल उन usingबयानों को जोड़ना होता है जिनकी मुझे आवश्यकता होती है, और स्पष्ट रूप से उन सभी को हटा दें जो मैं नहीं करता हूं। पावर प्रोडक्टिविटी टूल्स> "[x] सेव पर फॉरमॅट और फॉर्मेट असिंग"
JMD

2
@ जेएमडी मैंने .cs टेम्प्लेट फ़ाइल को संशोधित किया है, इसलिए इसमें शीर्ष पर दिए गए किसी भी कथन का उपयोग नहीं किया गया है! मैंने क्लास का खाका भी बदल दिया internal sealed
एरिक

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

ऐसा C # के लिए हो सकता है, लेकिन सभी .NET भाषाओं के लिए नहीं। (Powershell डिफ़ॉल्ट रूप से सिस्टम नामस्थान आयात करता है।)
FSCKur

311

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


6
मुझे समझ नहीं आ रहा है कि इस उत्तर का क्या अर्थ है और इसे क्यों उखाड़ा गया। आप typeof(string)प्रतिबिंब में उपयोग कर सकते हैं । उदाहरण एक: if (someMethodInfo.ReturnType == typeof(string)) { ... }उदाहरण दो: var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance);यह कहाँ है कि आपको उपयोग करना चाहिए String, नहीं string? यदि आप चीजों की कोशिश करते हैं Type.GetType("String")या तो Type.GetType("string"), न तो वर्ग पाएंगे क्योंकि नाम स्थान गायब है। यदि किसी मूर्खतापूर्ण कारण से आप केस-संवेदी तरीके .Nameसे किसी प्रकार की तुलना "string"करते हैं, तो आप सही हैं।
जेपी स्टिग नीलसन

256

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

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

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


2
बस एक उठाओ और सुसंगत हो। यदि आप घर की शैली के साथ कहीं काम करते हैं, तो इसका उपयोग करें।
एलन बी

3
दुर्भाग्य से शैली व्यक्तिगत पसंद है और समर्पित कोड स्वामी के बिना कई टीमों में बड़े कोड बेस में लागू करना महंगा हो सकता है। स्ट्रिंग बनाम स्ट्रिंग के बजाय देखभाल करने के लिए हमेशा अधिक महत्वपूर्ण मामले होते हैं। जो हमें "जीवन में अधिक महत्वपूर्ण चीजों" के लिए वापस लाता है
aiodintsov

यह निश्चित रूप से एक प्राथमिकता है; उदाहरण के लिए: मैं का उपयोग करना पसंद short, int, ushort, uintबजाय Int16, आदि ज्यादातर क्योंकि यह मैं कैसे सीखा है। दी, Int16कम अनुभव वाले लोगों के लिए तुरंत समझना आसान है। +1 मुझसे!
एमा

210

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

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

विचार करें:

String someString; 
string anotherString; 

11
क्या आप भी कोड लिखते हैं जैसे: Int32 i = 1; Int i = 1 के बजाय; ? यह उपलब्ध होने पर स्ट्रिंग उपनाम का उपयोग नहीं करने के लिए असंगत लगता है।
bytedev

29
@ नशावन: वास्तव में, हां, मैं अपने इरादे के अनुसार पूर्व को अधिक पठनीय Int32 i=1;पाता हूं, int i = 1;अर्थात मैं 32 बिट हस्ताक्षरित पूर्णांक चाहता हूं।
17

5
वैसे मुझे लगता है कि यह सब निर्भर करता है कि क्या डेवलपर को लगता है कि वे C # कोड (स्ट्रिंग) या .NET कोड (स्ट्रिंग) लिख रहे हैं। व्यक्तिगत रूप से मुझे लगता है कि मैं C # लिख रहा हूं (और यह C # है जो .NET का उपयोग कर रहा है)।
बट्टेव

7
@ एलेक्स: मेरी बात बस इतनी थी कि अस्पष्टता को दूर करने के लिए मैं अपनी कोडिंग में बहुत विशिष्ट होना पसंद करता हूं।
NotMe

22
स्पेक्ट्रम के पूर्ण दूसरे छोर पर, मैं लगभग हमेशा बस का उपयोग करता हूंvar
टिक

192

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

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


जेफरी रिक्टर सभी मामलों में सीएलआर प्रकार (सी # के माध्यम से सीएलआर) का उपयोग करने की सलाह देते हैं ताकि यहां जिस तरह का भ्रम हो रहा है उससे बच सकें।
जोश

स्पष्ट रूप से, चाहे आप एस या एस का उपयोग करते हैं, यह इस सवाल का कारण होगा, इसलिए नीचे-वोट रिक्टर। ;)
ब्रैड विल्सन

रिक्टर का मतलब था कि स्ट्रिंग का विकल्प नहीं होना चाहिए - माइक्रोसॉफ्ट को भाषा में नहीं होना चाहिए। आप रिक्टर को वोट नहीं कर सकते - वह एक किंवदंती है! :)
जो रत्जर

1
मैं इस बात से सहमत हूं कि शायद उपनामों का न होना बेहतर था। लेकिन यह देखते हुए कि हमारे पास है, मुझे लगता है कि उनका उपयोग करना ठीक है (लेकिन विधि नाम आदि में नहीं)
जॉन स्कीट

10
"स्ट्रिंग" "स्ट्रिंग" के समान नहीं है। का अर्थ है "System.String"। तो अगर आप "स्ट्रिंग" का उपयोग करते हैं तो आपको नामस्थान को शामिल करने के लिए "सिस्टम का उपयोग" करना होगा
थिएगोएवेव्स

185

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

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

System.String सीएलआर में एक प्रकार है।

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

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


1
stringC # में एक प्रकार नहीं है ; यह एक आरक्षित शब्द है जो सीएलआर में एक प्रकार से मैप करता है।
सीजरगॉन

@ केसरगॉन: ECMA-334 के अनुसार, खंड 8.2.1: "C # पूर्वनिर्धारित प्रकारों का एक सेट प्रदान करता है [...] पूर्वनिर्धारित संदर्भ प्रकार वस्तु और स्ट्रिंग हैं।"
रासमस फेबर

10
ECMA-334 के अनुसार, खंड 9.4.3, "स्ट्रिंग" एक कीवर्ड है। :-) मैं आपसे सहमत हूं कि "स्ट्रिंग" एक प्रकार है यदि आप शब्दार्थ पर ध्यान केंद्रित करते हैं, लेकिन मैं कहूंगा कि यदि आप वाक्य रचना पर ध्यान केंद्रित करते हैं तो यह एक कीवर्ड (यानी एक आरक्षित शब्द) है। मानक दोनों दृष्टिकोणों का समर्थन करता है (शायद बहुत अस्पष्ट रूप से!)। मेरे लिए, ओपी वाक्य-विन्यास के बारे में है, इसलिए जब मैं उत्तरों को देखता हूं, तो मैं वाक्यविन्यास पर ध्यान केंद्रित करता हूं, लेकिन मैं आपकी बात भी देखता हूं। इसके अलावा, आपका जवाब, जैसा कि यह खड़ा है, इसका मतलब यह हो सकता है कि दो अलग-अलग प्रकार मौजूद हैं: स्ट्रिंग और स्ट्रिंग, जब यह मामला नहीं है। एक दूसरे के लिए एक मानचित्रण है।
सिजेरॉन

आइए इस बारे में स्पष्ट हों। 'स्ट्रिंग' एक आरक्षित उपनाम है। यह एक वास्तविक डेटाटाइप नहीं है। यह कुछ ऐसा है जो किसी और चीज की ओर इशारा करता है। आप इन सभी उपनामों को हटा सकते हैं (या बस कभी भी इनका उपयोग नहीं करते हैं) और पूरी तरह से अच्छी प्रोग्रामिंग भाषा है।
क्वार्कली

168

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

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

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

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें

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

String s = "I am String";

या

string s = "I am String";

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

ऑब्जेक्ट:, System.Objectस्ट्रिंग:, System.Stringबूल:, System.Booleanबाइट:, System.Byteसोबते:, System.SByteशॉर्ट: System.Int16और इसी तरह

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

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

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

string s = String.ToUpper() ;

25
"संक्षेप में" स्ट्रिंग "एक उपनाम है (" स्ट्रिंग के "अलग-अलग नामों के साथ कहा जाता है)। यह सही नहीं है: उपनाम "स्ट्रिंग" है।
जेवियर एगेया

3
जब आप परिवर्तनशील घोषणा करते हैं तो "स्ट्रिंग" (छोटा "s") का उपयोग करना अच्छा होता है और जब आप इसे एक वर्ग नाम के रूप में उपयोग कर रहे होते हैं तो "स्ट्रिंग" (राजधानी "S") को प्राथमिकता दी जाती है। यह सम्मेलन अधिक मान्य नहीं लगता है: यदि आप विजुअल स्टूडियो 2015 का उपयोग करते हैं और Stringयह लिखने की कोशिश करते हैं कि यह आपको "अपने कोड को सरल बनाने" का सुझाव देता है, तो इसे string...
मैसिमिलियानो क्रूस

165

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

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


4
यही समस्या है, वे 'C #' उपनाम नहीं हैं, वे 'C' उपनाम हैं। C # भाषा में कोई मूल 'स्ट्रिंग' या 'int' नहीं है, बस वाक्यगत चीनी है।
क्वार्कली

16
निश्चित नहीं है कि "सी" यहां कहां से आया, क्योंकि C # 5 भाषा विनिर्देश पढ़ता है "कीवर्ड स्ट्रिंग पूर्वनिर्धारित वर्ग System.String के लिए केवल एक उपनाम है।" पृष्ठ 85 पर, पैरा 4.2.4। सभी उच्च स्तर की भाषा सीपीयू अनुदेश सेट और बायटेकोड पर सिंटैक्टिक चीनी हैं।
एओडाइनसोव

156

stringके लिए सिर्फ एक उपनाम है System.String। संकलक उन्हें पहचान के साथ व्यवहार करेगा।

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


स्ट्रिंग का उपयोग करने के लिए आपको सिस्टम को उपसर्ग करने की आवश्यकता नहीं है।
जो रैटजर

18
आपको एक using Systemका उपयोग करते समय शामिल करना होगा String, अन्यथा आपको निम्नलिखित त्रुटि मिलती है:The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
रोनाल्ड

143

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

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


120

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


4
मुझे पता नहीं था कि स्टैटिक विधियों को छोड़कर, स्टाइलकॉप स्ट्रिंग का उपयोग करेगा। मुझे लगता है कि यह उतना ही महान है कि मैं हमेशा इसका उपयोग करता हूं: प्रकार की घोषणाओं के लिए स्ट्रिंग और जब मैं स्थिर सदस्यों तक पहुंचता हूं तो स्ट्रिंग।
गोयूइक्स

101

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


4
मुझे लगता है कि यह एक शैतानी हो सकता है: using String = System.Int32; using Int32 = System.String; और फिर कीड़े की गिनती करें।
स्टीव

7
यह सही जवाब है। stringहै System.StringStringकुछ भी हो सकता है।
डेव कज़िनो

सहमत @DaveCousineau - यह उपनाम की बात है। आप एक अन्य Stringप्रकार बना सकते हैं जो System.String ऑब्जेक्ट पर सेट नहीं किया जाएगा। बाहर की जाँच करें: blog.paranoidcoding.com/2019/04/08/…
क्रिस्टोफर

"कीवर्ड stringका C # में ठोस अर्थ है। यह प्रकार है System.Stringजो कोर रनटाइम असेंबली में मौजूद होता है। रनटाइम इस प्रकार को आंतरिक रूप से समझता है और strings.NET में उन डेवलपर्स से अपेक्षा करता है जो उनसे अपेक्षा करते हैं । इसकी उपस्थिति C # के लिए इतनी महत्वपूर्ण है कि यदि वह टाइप नहीं है। कोड की एक पंक्ति को पार्स करने के प्रयास से पहले कंपाइलर बाहर निकल जाएगा। इसलिए stringC # कोड में एक सटीक, स्पष्ट अर्थ है। पहचानकर्ता Stringका C # में कोई ठोस अर्थ नहीं है। यह एक पहचानकर्ता है जो सभी नाम देखने के नियमों से गुजरता है। के रूप Widgetमें Student, आदि ... "
क्रिस्टोफर

3
मेटा पर डिस्कस किया गया: meta.stackoverflow.com/questions/385304/…
पैट्रिक

99

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


1
C # और VB.NET के बीच परिवर्तित करना काफी आसान है क्योंकि यह है। developerfusion.com/tools/convert/vb-to-csharp
अनुदान

87

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



78

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

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

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

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


72

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


67

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


67

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

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


66

पार्टी में देर से आना: मैं सीएलआर प्रकार का 100% समय का उपयोग करता हूं (अच्छी तरह से, सिवाय इसके कि अगर सी # प्रकार का उपयोग करने के लिए मजबूर किया जाए, लेकिन मुझे याद नहीं है कि आखिरी बार कब था)।

मैंने मूल रूप से यह करना शुरू कर दिया है, रिची द्वारा सीएलआर पुस्तकों के अनुसार। यह मेरे लिए समझ में आया कि सभी सीएलआर भाषाओं को अंततः सीएलआर प्रकारों के सेट का समर्थन करने में सक्षम होना चाहिए, इसलिए सीएलआर प्रकारों का उपयोग करके स्वयं को स्पष्ट रूप से प्रदान किया जाता है, और संभवतः अधिक "पुन: प्रयोज्य" कोड।

अब जब मैं इसे वर्षों से कर रहा हूं, तो यह एक आदत है और मुझे वह रंगाई पसंद है जो वीएस सीएलआर प्रकारों के लिए दिखाता है।

एकमात्र वास्तविक डाउनर यह है कि ऑटो-पूरा सी # प्रकार का उपयोग करता है, इसलिए मैं सीएलटी टाइप को निर्दिष्ट करने के लिए स्वचालित रूप से उत्पन्न प्रकार को फिर से टाइप करता हूं।

इसके अलावा, अब, जब मैं "इंट" या "स्ट्रिंग" देखता हूं, तो यह मेरे लिए वास्तव में गलत लगता है, जैसे मैं 1970 के सी कोड को देख रहा हूं।


49

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

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

इसी तरह, intमैप्स टू System.Int32


64 बिट बिल्ड में, इंट्री मैप्स System.Int64 (8 बाइट्स) में, 32 बिट में इसे मैप्स में System.Int32 (4 बाइट्स) में
एलेक्स

1
IntPtr और UIntPtr प्लेटफ़ॉर्म के अनुसार आकार बदलने वाले एकमात्र प्रकार हैं ( वास्तविक सूचक प्रकारों की तरह int*और [U] IntPtrs या वास्तविक संकेत से बना प्रकार)।
पी डैडी

45

डैनियल सोलिस की पुस्तक के इस मुद्दे पर एक उद्धरण है ।

सभी पूर्वनिर्धारित प्रकारों को सीधे अंतर्निहित .NET प्रकारों में मैप किया जाता है। C # प्रकार के नाम (स्ट्रिंग) केवल .NET प्रकार (स्ट्रिंग या System.String) के लिए उपनाम हैं, इसलिए .NET नाम का उपयोग ठीक से काम करता है, हालांकि यह हतोत्साहित किया जाता है। C # प्रोग्राम के भीतर, आपको .NET नामों के बजाय C # नामों का उपयोग करना चाहिए।


41

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

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

उदाहरण

string String = "I am a string";

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

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

2
एकमात्र छोटा अंतर यह है कि यदि आप स्ट्रिंग वर्ग का उपयोग करते हैं, तो आपको अपनी फ़ाइल के ऊपर सिस्टम नेमस्पेस आयात करने की आवश्यकता है, जबकि स्ट्रिंग कीवर्ड का उपयोग करते समय आपको ऐसा करने की आवश्यकता नहीं है।
उत्तम

ऐसे सरल उपयोग-मामले हैं जहां समानता कथन विफल हो जाएगा ... जैसे कि एक प्रकार की कॉल स्ट्रिंग को ब्लाह नेमस्पेस में परिभाषित करना और उस नामस्थान को उस फ़ाइल में आयात करना जिसमें समानता कथन चल रहा है।
रिक

40

हाँ, उनके बीच कोई अंतर नहीं है, जैसे boolऔर Boolean


40

@JaredPar (C # संकलक और विपुल SO उपयोगकर्ता पर एक डेवलपर!) ने इस मुद्दे पर एक शानदार ब्लॉग पोस्ट लिखा । मुझे लगता है कि यह यहां साझा करने लायक है। यह हमारे विषय पर एक अच्छा दृष्टिकोण है।

stringबनाम Stringएक शैली बहस नहीं है

[...]

stringC # में कीवर्ड का ठोस अर्थ है। यह प्रकार है System.Stringजो कोर रनटाइम असेंबली में मौजूद है। रनटाइम आंतरिक रूप से इस प्रकार को समझता है और डेवलपर्स को .NET में स्ट्रिंग्स के लिए अपेक्षाएं प्रदान करता है। इसकी उपस्थिति C # के लिए इतनी महत्वपूर्ण है कि यदि वह प्रकार मौजूद नहीं है तो संकलक कोड की एक पंक्ति को पार्स करने का प्रयास करने से पहले बाहर निकल जाएगा। इसलियेstring C # कोड में एक सटीक, स्पष्ट अर्थ है।

पहचानकर्ता Stringका C # में कोई ठोस अर्थ नहीं है। यह एक पहचानकर्ता है कि के रूप में सभी नाम देखने नियमों के माध्यम से चला जाता है Widget, Student, आदि ... यह स्ट्रिंग के लिए बाध्य कर सकता है या इसे में एक और विधानसभा पूरी तरह जिसका उद्देश्य से पूरी तरह से अलग हो सकता है एक प्रकार करने के लिए बाध्य कर सकता है string। इससे भी बदतर इसे एक तरह से परिभाषित किया जा सकता है जैसे कि कोड String s = "hello"; संकलन करना जारी रखा।

class TricksterString { 
  void Example() {
    String s = "Hello World"; // Okay but probably not what you expect.
  }
}

class String {
  public static implicit operator String(string s) => null;
}

का वास्तविक अर्थ Stringहमेशा नाम समाधान पर निर्भर करेगा। इसका मतलब है कि यह परियोजना के सभी स्रोत फ़ाइलों और सभी संदर्भित विधानसभाओं में परिभाषित सभी प्रकारों पर निर्भर करता है। संक्षेप में यह जानने के लिए काफी संदर्भ की आवश्यकता है कि इसका क्या मतलब है।

यह सच है कि अधिकांश मामलों में Stringऔर stringएक ही प्रकार से बंधेगा। लेकिन Stringअभी भी उपयोग करने का मतलब है कि डेवलपर्स अपने कार्यक्रम को उन जगहों पर व्याख्या करने के लिए छोड़ रहे हैं जहां केवल एक सही उत्तर है। जब Stringयह गलत प्रकार से बांधता है तो यह डेवलपर्स को घंटों तक डिबगिंग छोड़ सकता है, संकलक टीम पर कीड़े दाखिल कर सकता है और आमतौर पर समय बर्बाद कर रहा है जिसे उपयोग करके बचाया जा सकता था string

अंतर का अनुमान लगाने का एक और तरीका इस नमूने के साथ है:

string s1 = 42; // Errors 100% of the time  
String s2 = 42; // Might error, might not, depends on the code

कई लोग तर्क देंगे कि यह जानकारी तकनीकी रूप से सटीक Stringहै, फिर भी इसका उपयोग करना ठीक है क्योंकि यह बहुत दुर्लभ है कि एक कोड आधार इस नाम का एक प्रकार परिभाषित करेगा। या कि जबString इसे परिभाषित किया जाता है तो यह एक खराब कोड आधार का संकेत है।

[...]

आप देखेंगे कि Stringइसे पूरी तरह से मान्य उद्देश्यों के लिए परिभाषित किया गया है: प्रतिबिंब हेल्पर्स, क्रमांकन लाइब्रेरी, लेकर्स, प्रोटोकॉल, आदि ... इनमें से किसी भी लाइब्रेरी Stringबनाम के लिएstring के वास्तविक परिणाम हैं जहां कोड का उपयोग किया जाता है।

इसलिए याद रखें जब आप Stringबनाम stringबहस देखते हैं तो यह शब्दार्थ के बारे में है, शैली के बारे में नहीं। स्ट्रिंग का चयन आपके कोड आधार पर कुरकुरा अर्थ देता है। चुनना Stringगलत नहीं है, लेकिन यह भविष्य में आश्चर्य के लिए दरवाजा खुला छोड़ रहा है।

नोट: मैंने अधिकतर ब्लॉग पोस्ट को आर्काइव कारण के लिए कॉपी / पेस्ट किया है। मैं कुछ हिस्सों को अनदेखा करता हूं, इसलिए यदि आप कर सकते हैं तो मैं ब्लॉग पोस्ट को छोड़ने और पढ़ने की सलाह देता हूं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.