C # में, मुझे स्ट्रिंग का उपयोग करने के लिए string.Empty या String.Empty या "" का उपयोग करना चाहिए?


705

C # में, मैं एक स्ट्रिंग मान को एक रिक्त स्ट्रिंग के साथ प्रारंभ करना चाहता हूं।

मुझे यह कैसे करना चाहिए? सही तरीका क्या है, और क्यों?

string willi = string.Empty;

या

string willi = String.Empty;

या

string willi = "";

और क्या?


7
जावा के लिए भी इसी तरह की चर्चा देखें: stackoverflow.com/questions/213985/…
harpo

39
हालांकि String.IsNullOrEmpty (string myString) का उपयोग करना बेहतर है, निश्चित रूप से?
ज़ोंबीशेप

3
मैं [string.IsNullOrWhiteSpace (stringvalue)] का उपयोग करता हूं ... .net 4.0 में काम करता है। आरंभ करने के लिए, मैं बस उपयोग करता हूं: [var text = "";] सरल, पठनीय और टाइप करने के लिए कम से कम समय लेता हूं :)
जलाल एल-शायर

61
आपके चर का उल्लसित नाम अधिक महत्वपूर्ण है।
अरज

5
जिस चीज ने मुझे दिलचस्पी दी है, वह यह है कि एक खाली संपत्ति क्यों है। यह अच्छा है और सब कुछ है, लेकिन एक आवश्यक और पूर्ण नहीं होना चाहिए।
मास्टरमैटिक

जवाबों:


808

जो कुछ भी आप और आपकी टीम सबसे अधिक पठनीय पाते हैं, उसका उपयोग करें।

अन्य उत्तरों ने सुझाव दिया है कि आपके द्वारा उपयोग किए जाने पर हर बार एक नया स्ट्रिंग बनाया जाता है ""। यह सच नहीं है - स्ट्रिंग इंटर्निंग के कारण, इसे या तो एक बार प्रति विधानसभा या एक बार AppDomain (या संभवतः पूरी प्रक्रिया के लिए एक बार - उस मोर्चे पर निश्चित नहीं) के अनुसार बनाया जाएगा। यह अंतर नगण्य है - बड़े पैमाने पर, व्यापक रूप से महत्वहीन।

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

तर्क है कि ""और " "आसानी से एक दूसरे के लिए गलत कर रहे हैं वास्तव में मेरे साथ नहीं धोता है। जब तक आप एक आनुपातिक फ़ॉन्ट का उपयोग नहीं कर रहे हैं (और मैंने ऐसा करने वाले किसी भी डेवलपर्स के साथ काम नहीं किया है) यह अंतर बताना बहुत आसान है।


75
आपकी आँखें आपको तब चकरा सकती हैं जब आप "" के लिए "" आप आसानी से गलती कर सकते हैं "" देखने की उम्मीद कर रहे हैं। यही कारण है कि किसी और ने जो कुछ लिखा है, उसे संपादित करना आसान है। आपके मस्तिष्क में पाठ के बारे में पहले से विचार नहीं हैं, इसलिए विसंगतियों को चुनना आसान है।
tvanfosson

125
@tvanfosson: तो क्या आप (या एक सहयोगी) वास्तव में इसे बग के रूप में काट रहे हैं? मुझे इस तरह के दावे पर संदेह है बिना इसके कि वास्तव में समस्याएँ पैदा हो रही हैं। मैं वर्षों से इसे गलत होने के बिना "" का उपयोग कर रहा हूं ...
जॉन स्कीट

34
निजी तौर पर, मैंने हमेशा String.Empty का उपयोग किया है, जब भी मैं स्ट्रिंग पर एक स्थिर विधि का उपयोग करना चाहता हूं, तो मैं 'S' का उपयोग करता हूं, यह सिर्फ एक व्यक्तिगत पूर्वाग्रह है जो मुझे एक प्रकार से एक चर को भेद करने की अनुमति देता है। लेकिन यह जावा से StonsUtils.EMPTY का उपयोग करने से सिर्फ एक कैरी-ओवर है। ब्याज की एक बात मैं लगभग अंधा हूँ और यह निश्चित रूप से मेरे लिए पठनीयता के साथ मदद करता है।
ब्रेट रायन

79
आपने मुझे टाइम्स न्यू रोमन में विकसित करने की प्रेरणा दी है।
जस्टिन रुस्बैच

73
कुछ अस्पष्ट कारणों के string.Emptyलिए एक स्थिर नहीं है । इसका मतलब है कि कई मामलों में जहां संकलन-समय की आवश्यकता होती है, string.Emptyकानूनी भी नहीं है। इसमें स्टेटमेंट में case ""ब्लॉक switch, वैकल्पिक मापदंडों के डिफ़ॉल्ट मान , विशेषताओं को लागू करने में पैरामीटर और गुण , और बहुत सारी अन्य परिस्थितियां (पाठक को छोड़ दी गई हैं) शामिल हैं। इसलिए यह देखते हुए कि string.Emptyकुछ सामान्य स्थितियों में इसे बंद कर दिया जाता है, बेहतर है कि ""-सहयोग सम्मेलन का उपयोग किया जाए।
जेपी स्टिग नीलसन

375

वहाँ वास्तव में एक प्रदर्शन और कोड उत्पन्न दृष्टिकोण से कोई अंतर नहीं है। प्रदर्शन परीक्षण में, वे आगे और पीछे चले गए, जिसमें से एक दूसरे के मुकाबले तेज था, और केवल मिलीसेकंड से।

पर्दे के कोड के पीछे देखने में, आपको वास्तव में कोई अंतर नहीं दिखता है। एकमात्र अंतर IL में है, जो string.Emptyopcode ldsfld का ""उपयोग करते हैं और opcode का उपयोग करते हैं ldstr, लेकिन यह केवल इसलिए string.Emptyहै क्योंकि स्थैतिक है, और दोनों निर्देश समान कार्य करते हैं। यदि आप उत्पादित विधानसभा को देखते हैं, तो यह बिल्कुल वैसा ही है।

C # कोड

private void Test1()
{
    string test1 = string.Empty;    
    string test11 = test1;
}

private void Test2()
{
    string test2 = "";    
    string test22 = test2;
}

आईएल कोड

.method private hidebysig instance void 
          Test1() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test1,
                [1] string test11)
  IL_0000:  nop
  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test1
.method private hidebysig instance void 
        Test2() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test2,
                [1] string test22)
  IL_0000:  nop
  IL_0001:  ldstr      ""
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test2

विधानसभा कोड

        string test1 = string.Empty;
0000003a  mov         eax,dword ptr ds:[022A102Ch] 
0000003f  mov         dword ptr [ebp-40h],eax 

        string test11 = test1;
00000042  mov         eax,dword ptr [ebp-40h] 
00000045  mov         dword ptr [ebp-44h],eax 
        string test2 = "";
0000003a  mov         eax,dword ptr ds:[022A202Ch] 
00000040  mov         dword ptr [ebp-40h],eax 

        string test22 = test2;
00000043  mov         eax,dword ptr [ebp-40h] 
00000046  mov         dword ptr [ebp-44h],eax 

13
@PrateekSaluja: IL देखने के लिए आप ildasm.exe का उपयोग कर सकते हैं, जो विजुअल स्टूडियो के साथ जहाज करता है। डायस्सेम को देखने के लिए, जब आप एक ब्रेकपॉइंट (रिलीज़ कोड में भी काम करता है) पर हिट करते हैं, तो डिबग मेनू पर 'डिस्सैशिंग' विंडो का उपयोग करें।
थॉमस ब्रैट

1
नफरत है कि मैं इस उत्पाद की सिफारिश करने वाला हूँ .. लेकिन .. परावर्तक आपको अपनी भाषा चुनने की सुविधा देता है जब स्रोत और आईएल एक विकल्प होता है! ILDASM सिर्फ दिनांकित महसूस कर रहा है ... MS टूल्स टीम अच्छे टूल को चमकाने या जारी करने के लिए प्रतीत नहीं होती है!
15

80

सबसे अच्छा कोड कोई कोड नहीं है :

कोडिंग की मौलिक प्रकृति यह है कि प्रोग्रामर के रूप में हमारा कार्य यह पहचानना है कि हम जो भी निर्णय लेते हैं वह एक व्यापार है। […] संक्षिप्तता के साथ शुरू करो। परीक्षण द्वारा आवश्यकतानुसार अन्य आयाम बढ़ाएं।

नतीजतन, कम कोड बेहतर कोड है: के लिए पसंद ""करते हैं string.Emptyया String.Empty। उन दो को छह बार बिना किसी अतिरिक्त लाभ के साथ - निश्चित रूप से कोई अतिरिक्त स्पष्टता नहीं है, क्योंकि वे ठीक उसी जानकारी को व्यक्त करते हैं।


1
लेकिन C # में हम सिर्फ
string.IsNullOrWhitespace

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

3
@Markus कि अत्यधिक निर्भर करता है: एक पाश चर एक सूचकांक का प्रतिनिधित्व करने के लिए, i है एक लंबे चर नाम की तुलना में बेहतर। इससे भी अधिक सामान्य, छोटे परिवर्तनशील नाम जो समान जानकारी को स्पष्ट करते हैं, हमेशा स्पष्ट होते हैं। यह सिर्फ इतना है कि आवश्यक जानकारी को व्यक्त करने के लिए आपको एक निश्चित चरित्र की लंबाई की आवश्यकता है, और मैं इससे इनकार नहीं कर रहा हूं (कोई भी नहीं है)।
कोनराड रुडोल्फ

2
@ कोनराड: मैं केवल एक अच्छा चर नाम है अगर लूप छोटा है और इसमें कोई अन्य सूचक नहीं है। लेकिन मैं सहमत हूँ कि अगर sth। एक ही जानकारी को और अधिक संक्षेप में बताया जा सकता है, जो कि बेहतर होगा, जैसे स्ट्रिंग में। खाली / "" मामला। String.Empty कोई स्पष्टता नहीं जोड़ता है।
मार्कस मेयर

मेरे लिए: string.Empty कहते हैं कि यह स्ट्रिंग है और हर समय खाली होना चाहिए, जबकि "" लिखते समय यह स्ट्रिंग खाली हो सकता है लेकिन आप इसे बदलने के लिए स्वतंत्र हैं।
एरोसॉन

54

एक अंतर यह है कि यदि आप एक switch-caseवाक्यविन्यास का उपयोग करते हैं, तो आप नहीं लिख सकते case string.Empty:क्योंकि यह एक स्थिर नहीं है। आप एCompilation error : A constant value is expected

अधिक जानकारी के लिए इस लिंक को देखें: string-खाली-बनाम-खाली-उद्धरण


22
switchबयान एक बहुत अच्छा उदाहरण है। इसके अलावा, यदि आप एक वैकल्पिक पैरामीटर बनाते हैं, जैसे void MyMethod(string optional = "") { ... }, इसका उपयोग करना भी संभव नहीं है string.Empty। और फिर बेशक यदि आप किसी constक्षेत्र या स्थानीय चर को परिभाषित करना चाहते हैं , const string myString = "";तो फिर ""से एकमात्र विकल्प है। यदि केवल string.Emptyएक स्थिर क्षेत्र होता, तो कोई अंतर नहीं होता। लेकिन ऐसा नहीं है, इसलिए कुछ मामलों में आपको उपयोग करना होगा ""। तो ""हर समय उपयोग क्यों नहीं ?
जेपी स्टिग नीलसन

5
यह वास्तव में एक मजबूत तर्क है क्योंकि इसका उपयोग करने string.Emptyसे आपको अपने कोड आधार में स्थिरता प्राप्त करने से रोकता है : आपको एक ही चीज़ को व्यक्त करने के लिए दो अलग-अलग संस्थाओं का उपयोग करना चाहिए। और उन चीजों की सूची में शामिल करने के लिए जिन्हें आप नहीं कर सकते हैं: आप विशेषताओं केstring.Empty साथ उपयोग नहीं कर सकते ।
22

2
बहुत अच्छे अंक! लिंक टूट गया है। यहाँ सामग्री की एक प्रति है: web.archive.org/web/20131230161806/http://kossovsky.net/…
ygoe

42

मैं पसंद करते हैं stringकरने के लिए String। चुनने string.Emptyके ऊपर ""एक को चुनने और इसके साथ चिपके हुए की बात है। उपयोग करने string.Emptyका लाभ यह स्पष्ट है कि आपका क्या मतलब है, और आप गलती से "\x003"अपने जैसे गैर-मुद्रण योग्य वर्णों की नकल नहीं करते हैं ""


101
मेरा तर्क है कि यदि आप गलती से गैर-मुद्रण योग्य वर्णों को अपने कोड में कॉपी कर रहे हैं, तो आपको इस प्रश्न से बड़ी समस्याएं मिल सकती हैं;)
जॉन स्कीट

9
ASCII \ 003 बी 2 बी मैसेजेस के लिए एक फील्ड सीमांकक होने के साथ होता है: मैंने साथ काम किया है
जिमी

7
(मैं \ x से बचने से बचने का सुझाव दूंगा, btw - यह "\ x9Bad कम्पाइलर" और "\ x9Good कम्पाइलर" के बीच अंतर को स्पॉट करना बहुत मुश्किल है, जिसके मूल रूप से अलग-अलग परिणाम हैं!)
जॉन स्कीट

जब भी मैं स्ट्रिंग पर एक स्थिर विधि बुलाता हूं, व्यक्तिगत रूप से मैं स्ट्रिंग पर स्ट्रिंग पसंद करता हूं। हालांकि मैं लगभग अंधा हूं और यह एक निजी प्राथमिकता है जिसे मैं किसी पर लागू नहीं करता।
ब्रेट रयान

2
@ जिमी ज़रूर, लेकिन हम खाली स्ट्रिंग के बारे में बात कर रहे थे। तर्क जो ""कॉपी / पेस्ट करने के दौरान खतरनाक है, वह शून्य है, मैं दावा करता हूं, क्योंकि आप खाली स्ट्रिंग को कभी भी कॉपी / पेस्ट नहीं करते हैं। अन्य स्ट्रिंग्स के लिए, यह निश्चित रूप से दिमाग में होना चाहिए।
टिमो

22

मैं झंकार में नहीं जा रहा था, लेकिन मुझे कुछ गलत जानकारी यहाँ दिखाई दे रही है।

मैं, व्यक्तिगत रूप से, पसंद करता हूं string.Empty। यह एक व्यक्तिगत प्राथमिकता है, और मैं केस-बाय-केस के आधार पर जो भी टीम के साथ काम करता हूं उसकी इच्छा पर झुकता हूं।

जैसा कि कुछ अन्य लोगों ने उल्लेख किया है, दोनों में कोई अंतर नहीं है string.Emptyऔर String.Empty

इसके अतिरिक्त, और यह एक छोटा ज्ञात तथ्य है, "" का उपयोग करना पूरी तरह से स्वीकार्य है। "" का हर उदाहरण, अन्य वातावरणों में, एक वस्तु का निर्माण करेगा। हालाँकि, .NET अपने स्ट्रिंग्स को इंटर्न करता है, इसलिए भविष्य के इंस्टेंस, इंटर्न पूल से उसी अपरिवर्तनीय स्ट्रिंग को खींच लेंगे, और कोई भी प्रदर्शन हिट नगण्य होगा। स्रोत: ब्राड अब्राम


20
मैं यह नहीं देखता कि "" तकनीकी रूप से "" का हर उदाहरण ऑब्जेक्ट क्यों बनाएगा। यह सिर्फ मौका नहीं है कि तार को नजरबंद किया गया है - यह सी # कल्पना में है।
जॉन स्कीट

15

मैं व्यक्तिगत रूप से "" पसंद करता हूं जब तक कि कुछ अधिक जटिल का एक अच्छा कारण नहीं है।


13

String.Emptyऔर string.Emptyबराबर हैं। Stringबीसीएल वर्ग नाम है; stringइसका सी # उपनाम (या शॉर्टकट, यदि आप होगा) है। साथ ही Int32और int। अधिक उदाहरणों के लिए डॉक्स देखें ।

जहां तक ""मेरा सवाल है, मुझे यकीन नहीं है।

व्यक्तिगत रूप से, मैं हमेशा उपयोग करता हूं string.Empty


10

बस हर डेवलपर के बारे में पता चल जाएगा कि "" का अर्थ क्या है। मैंने व्यक्तिगत रूप से स्ट्रिंग का सामना किया। पहली बार खाली किया और यह जानने के लिए कि क्या वे वास्तव में एक ही चीज़ हैं , यह जानने के लिए गूगल पर कुछ समय बिताना होगा ।


3
यह एक सार्वजनिक रूप से स्ट्रिंग क्षेत्र है और इसका मान "" है ... यह क्यों बदलेगा?
मैथ्यू Whited

5
आप उस बिंदु को याद करते हैं जो @ जैसन बनाता है। आप कैसे जानते हैं कि यह पहली बार आप क्या देख रहे हैं string.Empty? क्या आप जानते हैं कि आपने ""पहली बार क्या देखा था?
डेविड आर ट्रिबल

10

यह विषय बहुत पुराना और लंबा है, इसलिए मुझे क्षमा करें यदि इस व्यवहार का कहीं और उल्लेख किया गया है। (और मुझे उस उत्तर की ओर इंगित करें जो इसे कवर करता है)

यदि आप उपयोग करते हैं तो मुझे संकलक के व्यवहार में अंतर मिला है string.Empty या डबल उद्धरण । यदि आप स्ट्रिंग स्ट्रिंग का उपयोग नहीं करते हैं, तो यह अंतर दिखाता है।

प्रारंभिक string.Emptyसंकलक चेतावनी के मामले में

CS0219 - The variable 'x' is assigned but its value is never used

अपेक्षित उद्धरण मिलने पर दोहरे उद्धरण चिह्नों के साथ आरंभ करने के मामले में कभी भी उत्सर्जित नहीं किया जाता है।

इस लिंक पर कनेक्ट आलेख में इस व्यवहार को समझाया गया है: https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value

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


1
मेरा मानना ​​है कि आप उल्लेख करने वाले पहले व्यक्ति हैं। मैंने कई महीने पहले इस प्रश्नोत्तर के माध्यम से पढ़ा है और इस अंतर को याद नहीं करता, जो कि यदि मैं इसका उल्लेख करता तो मैं यह कर सकता था।
पालिक

2
दिलचस्प। ध्यान दें कि var unused = "literal";संकलक द्वारा एक घोषणा को पूरी तरह से दूर (हटा) किया जा सकता है। इसका कोई साइड इफेक्ट नहीं हो सकता है। दूसरी ओर, var unused = MyClass.Member;पूरी तरह से हटाया नहीं जा सकता। ऐसा इसलिए है क्योंकि पढ़ने के Memberदुष्प्रभाव हो सकते हैं। यदि Memberएक एक्सेसर के साथ एक स्थिर संपत्ति है get, तो यह स्पष्ट है कि कॉल करने वाले को कॉल करना होगा। लेकिन यहां तक ​​कि अगर Memberएक स्थिर क्षेत्र है, तो साइड इफेक्ट हो सकता है जो स्थैतिक निर्माता चला सकता है। यकीन है कि यह इस तरह से इसे करने के लिए बुरा कोडिंग शैली होगा । लेकिन आपको पढ़ने के लिए एक डमी की आवश्यकता है Member
जेपी स्टिग नीलसन

9

मैंने सांत्वना अनुप्रयोग में निम्न विधि का उपयोग करके यह बहुत ही सरल परीक्षण किया:

private static void CompareStringConstants()
{
    string str1 = "";
    string str2 = string.Empty;
    string str3 = String.Empty;
    Console.WriteLine(object.ReferenceEquals(str1, str2)); //prints True
    Console.WriteLine(object.ReferenceEquals(str2, str3)); //prints True
}

यह स्पष्ट रूप से बताता है कि सभी तीन चर क्रमशः str1, str2और str3हालांकि अलग-अलग वाक्यविन्यास का उपयोग करके आरंभिक रूप से स्मृति में बिल्कुल एक ही स्ट्रिंग (शून्य लंबाई) ऑब्जेक्ट की ओर इशारा कर रहे हैं। मैंने .NET 4.5 कंसोल एप्लिकेशन में यह परीक्षण किया। इसलिए आंतरिक रूप से उनमें कोई अंतर नहीं है और यह सब सुविधा के लिए उबलता है, जिसे आप प्रोग्रामर के रूप में उपयोग करना चाहते हैं। स्ट्रिंग क्लास के इस व्यवहार को .NET में स्ट्रिंग इंटर्निंग के रूप में जाना जाता है । इस अवधारणा का वर्णन करते हुए एरिक लिपर्ट का यहाँ बहुत अच्छा ब्लॉग है


8

ऊपर मे से कोई।

वहाँ कई, कई बेहतर चीजें हैं pontificate है। जैसे कि किस रंग की छाल एक पेड़ पर सबसे अच्छी लगती है, मुझे लगता है कि डल्सेट मॉस के टिंग के साथ अस्पष्ट भूरा है।


7

मैं दृढ़ता से स्ट्रिंग पसंद करता हूँ। खाली, अन्य कारणों से अलग आपको यह सुनिश्चित करने के लिए कि यह क्या है और आपने गलती से सामग्री को हटा नहीं दिया है, लेकिन मुख्य रूप से अंतर्राष्ट्रीयकरण के लिए। यदि मुझे उद्धरण में एक स्ट्रिंग दिखाई देती है तो मुझे हमेशा आश्चर्य होता है कि क्या यह नया कोड है और इसे एक स्ट्रिंग तालिका में रखा जाना चाहिए। इसलिए हर बार कोड बदल जाता है / समीक्षा की जाती है कि आपको "उद्धरणों में कुछ" देखने की ज़रूरत है और हाँ आप खाली तारों को फ़िल्टर कर सकते हैं, लेकिन मैं लोगों से कहता हूँ कि उद्धरणों में कभी तार न डालें तो अच्छा है जब तक आपको पता नहीं चलेगा कि यह स्थानीयकृत नहीं होगा। ।


7

किसी ने उल्लेख नहीं किया कि VisualStudio स्ट्रिंग में अलग-अलग रंग का कोड है। जो पठनीयता के लिए महत्वपूर्ण है। इसके अलावा, लोअर केस आमतौर पर वेरिएस और टाइप के लिए उपयोग किया जाता है, एक बड़ी बात नहीं है, लेकिन String.Empty एक स्थिरांक है, न कि एक var या टाइप।


String.Empty एक स्थिर नहीं है: देखें stackoverflow.com/questions/507923/… यह वास्तव में डिजाइन द्वारा स्ट्रिंग वर्ग का एक उदाहरण है। और रंग से पहले उल्लेख किया गया था, हालांकि थोड़ा छिपा हुआ: stackoverflow.com/questions/263191/…
माइकल

6

string का पर्यायवाची है System.Stringप्रकार , वे समान हैं।

मान भी समान हैं: string.Empty == String.Empty == ""

मैं कोड में चरित्र लगातार प्रयोग करेंगे नहीं "" है, बल्कि string.Emptyया String.Empty- देखना आसान प्रोग्रामर क्या मतलब।

के बीच stringऔर Stringमुझे लोअर केस stringज्यादा पसंद है क्योंकि मैं डेल्फी के साथ बहुत सालों से काम करता था और डेल्फी स्टाइल लोअरकेस हैstring

इसलिए, अगर मैं आपका बॉस होता, तो आप लिख रहे होते string.Empty


6

मैं एहसान होगा string.Emptyखत्म हो गया String.Emptyक्योंकि आप इसे एक को शामिल करने की जरूरत के बिना उपयोग कर सकते हैंusing System; आपकी फ़ाइल में।

पिकिंग ""ओवर के लिए string.Empty, यह व्यक्तिगत प्राथमिकता है और इसे आपकी टीम द्वारा तय किया जाना चाहिए।


2
मैं टीम का एकमात्र सदस्य हूं, मैं कैसे तय करूं? एक पासा फेंको?
गक्क्निब

1
उन लोगों के लिए जो यह सोच रहे हैं कि string.Emptyबिना using Systemनाम स्थान के आयात का निरंतर उपयोग कैसे संभव है - C # में कीवर्ड बस अपने पूरी तरह से योग्य नाम में परिवर्तित हो जाते हैं जिसमें नाम शामिल होने से पहले और साथ ही आउटपुट में MSIL लिखा होता है * .dll या *। exe फ़ाइल। इतनी प्रभावी string.Emptyरूप System.String.Emptyसे कंपाइलर द्वारा MSIL में लिखा गया है। और जैसा कि आप पहले से ही जानते होंगे कि यदि आप पूरी तरह से योग्य नाम का उल्लेख करते हैं, तो आप अपनी कोड फ़ाइल के शीर्ष पर नाम स्थान आयात करने के लिए छोड़ सकते हैं।
RBT

5

मुझे कोई फर्क नहीं पड़ता। अंतिम हालांकि टाइप करने के लिए सबसे तेज है :)


4

इससे कोई फर्क नहीं पड़ता - वे बिल्कुल एक ही चीज हैं। हालांकि, मुख्य बात यह है कि आप सुसंगत होना चाहिए

ps मैं हर समय "सही बात क्या है" के इस प्रकार के साथ संघर्ष करता हूं।


1
आधुनिक दुनिया में, "सुसंगत" का अर्थ है दुनिया भर में सभी टीमों के अनुरूप, जो स्टैकऑवरफ्लो के लक्ष्यों में से एक है। यदि मैं सुझाव दे सकता हूं, तो String.Empty का उपयोग करें।
पावेल रेड्ज़विलोवस्की

1
कुछ भाषाओं में एक खाली स्थिरांक नहीं है, और सभी भाषाओं में मैं एक शून्य-लंबाई स्ट्रिंग के लिए अनुमति देने के बारे में सोच सकता हूं। इसलिए मैं अन्य भाषाओं के साथ संगतता के लिए "" वोट देता हूं। :)
टॉमएक्सपी 411

4

यह पूरी तरह से एक कोड-शैली प्राथमिकता है, जो .NET को स्ट्रिंग्स को संभालती है। हालाँकि, यहाँ मेरी राय है :)

मैं हमेशा BCL प्रकार के नामों का उपयोग करता हूं जब स्थैतिक तरीकों, गुणों और क्षेत्रों तक पहुंच होती है: String.Emptyया Int32.TryParse(...)याDouble.Epsilon

मैं हमेशा नए उदाहरणों की घोषणा करते समय C # कीवर्ड का उपयोग करता हूं: int i = 0;याstring foo = "bar";

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


3

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


3

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

[संपादित करें]

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


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

3

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

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

यदि आप string.EMpty या Strng.Empty टाइप करते हैं, तो कंपाइलर आपको बता देता है कि आपने इसे गलत किया है। तुरंत ही। यह बस संकलन नहीं करेगा। एक डेवलपर के रूप में आप विशिष्ट इरादे का हवाला दे रहे हैं कि संकलक (या अन्य डेवलपर) किसी भी तरह से गलत व्याख्या नहीं कर सकता है, और जब आप इसे गलत करते हैं, तो आप बग नहीं बना सकते हैं।

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

स्ट्रिंग से बहुत पहले। खाली एक चीज थी जो मैंने एक मानक पुस्तकालय का उपयोग किया है जो EMPTY_STRING निरंतर को परिभाषित करता है। हम अभी भी उस स्थिति में स्टेटमेंट का उपयोग करते हैं जहां string.Empty की अनुमति नहीं है।

जब भी संभव हो, संकलक को आपके लिए काम करने के लिए रखें, और मानव त्रुटि की संभावना को खत्म करें, चाहे कितना छोटा हो। IMO, यह ट्रम्प "पठनीयता" है जैसा कि अन्य ने उद्धृत किया है।

विशिष्टता और संकलन समय प्रवर्तन। यह रात के खाने के लिए क्या है।


3

मैं "" का उपयोग करता हूं क्योंकि यह मेरे कोड में अलग-अलग पीले रंग का होगा ... किसी कारण के लिए। स्ट्रिंग मेरे विजुअल स्टूडियो कोड थीम में सभी सफेद है। और मेरा मानना ​​है कि मेरे लिए सबसे ज्यादा मायने रखता है।


2

संकलक को लंबे समय में उन्हें समान बनाना चाहिए। एक मानक चुनें, ताकि आपका कोड पढ़ने में आसान हो, और इसके साथ चिपके रहें।


2

मैं बस कुछ कोड देख रहा था और यह सवाल मेरे दिमाग में कौंध गया, जिसे मैंने कुछ समय पहले पढ़ा था। यह निश्चित रूप से पठनीयता का सवाल है।

निम्नलिखित सी # कोड पर विचार करें ...

(customer == null) ? "" : customer.Name

बनाम

(customer == null) ? string.empty : customer.Name

मुझे व्यक्तिगत रूप से उत्तरार्द्ध कम अस्पष्ट और पढ़ने में आसान लगता है।

जैसा कि अन्य लोगों द्वारा बताया गया है कि वास्तविक अंतर नगण्य हैं।


1

मुझे लगता है कि दूसरा "उचित" है, लेकिन ईमानदार होने के लिए मुझे नहीं लगता कि यह मायने रखेगा। कंपाइलर को काफी स्मार्ट होना चाहिए ताकि उनमें से कोई भी एक ही बायोटेक को संकलित कर सके। मैं खुद "" का उपयोग करता हूं।


1

जबकि अंतर बहुत है, बहुत कम, अंतर अभी भी मौजूद है।

1) "" वस्तु बनाता है जबकि String.Empty नहीं करता है। लेकिन यह ऑब्जेक्ट एक बार बनाया जाएगा और बाद में स्ट्रिंग पूल से संदर्भित किया जाएगा यदि आपके पास कोड में एक और "" है।

2) स्ट्रिंग और स्ट्रिंग एक ही हैं, लेकिन मैं स्ट्रिंग का उपयोग करने की सलाह दूंगा। सी # कोडिंग मानक।


1
string.Empty है "", जाँच स्रोत
dss539

1

पर http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx :

जैसा कि डेविड का कहना है, के बीच अंतर है String.Emptyऔर ""बहुत छोटे हैं, लेकिन एक अंतर है। ""वास्तव में एक ऑब्जेक्ट बनाता है, यह संभवतः स्ट्रिंग इंटर्न पूल से बाहर निकाला जाएगा, लेकिन फिर भी ... जबकि String.Emptyकोई ऑब्जेक्ट नहीं बनाता है ... इसलिए यदि आप वास्तव में स्मृति दक्षता में देख रहे हैं, तो मैं सुझाव देता हूं String.Empty। हालाँकि, आपको यह ध्यान रखना चाहिए कि अंतर इतना सुव्यवस्थित है कि आप इसे अपने कोड में कभी नहीं देख पाएंगे ...
जैसा कि System.String.Emptyया string.Emptyया String.Empty... मेरा देखभाल स्तर कम है; ;-)


1
उस MSDN ब्लॉग पोस्ट 2003 में था .... क्या आप सुनिश्चित हैं कि यह अभी भी हाल ही में .NET संस्करणों के लिए सच है ?!
कैर्स्टन शुट्टे

@ CarstenSchütte: मुझे लगता है कि इस तरह की सुविधा को बहुत बदलने का इरादा नहीं है ... और अगर यह था, तो इसके बारे में इंटरनेट पर कुछ चर्चा थी।
सर्गियोल

3
@sergiol यदि कोई फ़ील्ड शाब्दिक से अधिक कुशल है तो यह स्पष्ट रूप से एक प्रदर्शन बग है। इसलिए उम्मीद है कि यह अब तक ठीक हो जाएगा।
कोनराड रुडोल्फ

1

खाली स्ट्रिंग एक नाम मात्र के खाली सेट की तरह है जिसे हर कोई कॉल करने के लिए उपयोग करता है ""। साथ ही औपचारिक भाषाओं में एक वर्णमाला से निर्मित तार होते हैं जिनकी लंबाई शून्य होती है जिन्हें रिक्त स्ट्रिंग कहा जाता है। सेट और स्ट्रिंग दोनों के लिए एक विशेष प्रतीक है। खाली स्ट्रिंग: ε और खाली सेट: ε। यदि आप इस शून्य लंबाई स्ट्रिंग के बारे में बात करना चाहते हैं, तो आप इसे खाली स्ट्रिंग कहेंगे, ताकि हर कोई जानता हो कि आप क्या उल्लेख कर रहे हैं। अब यदि आप इसे खाली स्ट्रिंग का नाम देते हैं तो string.Emptyकोड में उपयोग क्यों नहीं करते हैं , इसका उद्देश्य स्पष्ट है। नकारात्मक पक्ष यह है कि यह एक स्थिर नहीं है और इसलिए हर जगह उपलब्ध नहीं है, जैसे विशेषताओं में। (यह कुछ तकनीकी कारणों से स्थिर नहीं है, संदर्भ स्रोत देखें।)


0

मैं पसंद करता हूं ""क्योंकि यह छोटा है और String.Emptyएक ऐसी समस्या को हल करता है जो मौजूद नहीं है।

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