Koks skirtumas tarp eilutės ir eilutės C #?

Pavyzdys (pastabos atvejis):

10 авг. nustatė Lance Fisher 10 rug. 2008-08-10 10:18 '08 10:18 am. 2008-08-10 10:18
@ 64 atsakymai
  • 1
  • 2
  • 3

string yra C # slapyvardis System.String .
Techniškai nėra skirtumo. Tai tarsi System.Int32 prieš System.Int32 .

Kalbant apie rekomendacijas, paprastai rekomenduojama naudoti string kiekvieną kartą, kai kalbate apie objektą.

Pavyzdžiui

 string place = "world"; 

Be to, manau, kad paprastai rekomenduojama naudoti String jei reikia konkrečiai paminėti klasę.

Pavyzdžiui

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

Tai yra stilius, kurį „Microsoft“ siekia naudoti savo pavyzdžiuose .

Atrodo, kad šios srities lyderystė galėjo pasikeisti, nes StyleCop dabar įgyvendina specialius C # slapyvardžius.

5398
10 авг. Atsakymą pateikė Derek Park 10 rug. 2008-08-10 10:22 '08, 10:22, 2008-08-10 10:22

Tiesiog dėl išsamumo, čia yra smegenų sąvartynų informacija ...

Kaip pažymėjo kiti, string yra System.String . Jie yra sukompiliuoti į tą patį kodą, todėl nėra jokio skirtumo vykdymo metu. Tai tik vienas iš C # slapyvardžių. Visas sąrašas:

Yra viena aplinkybė, kurioje jūs turite naudoti slapyvardžius: aiškiai nurodydami išvardinto tipo tipą. Pavyzdžiui:

3163
18 окт. Atsakyti Jon Skeet spalio 18 d 2008-10-18 21:52 '08, 9:52 val. 2008-10-18 21:52

String reiškia System.String ir tai yra .NET Framework tipas. String yra C # slapyvardis System.String . Abi yra surenkamos į „ System.String “ IL (tarpinė kalba), todėl nėra skirtumo. Pasirinkite, ką norite ir naudokite. Jei įvesite C # kodą, norėčiau naudoti String , nes tai yra C # tipo alias ir gerai žinomas C # programuotojams.

Tą patį galiu pasakyti apie ( int , System.Int32 ) ir tt

638
18 окт. Artur02 atsakymas 18 okt. 2008-10-18 20:25 '08 at 8:25 pm 2008-10-18 20:25

Geriausias atsakymas, kurį aš kada nors girdėjau, jei naudojate pateiktus tipo slapyvardžius C #, yra pateiktas Jeffrey Richter savo knygoje CLR Via C # . Čia yra jo 3 priežastys:

  • Mačiau, kad kai kurie kūrėjai buvo supainioti, nežinodami, ar naudoti kodą ar eilutę . Kadangi C # eilutėje (raktinis žodis) rodomas tiksliai sistemoje.String (tipas FCL), nėra jokio skirtumo, ir bet kuris iš jų gali būti naudojamas.
  • C, # ilgai rodomi sistemoje System.Int64 , tačiau kitoje programavimo kalba ilgai gali būti rodomi Int16 arba Int32 . Tiesą sakant, C ++ / CLI iš tikrųjų tvarko ilgą laiką kaip Int32 . Kažkas, kuri skaito šaltinio kodą vienoje kalboje, gali lengvai klaidingai suprasti kodo ketinimą, jei jis yra įpratęs programuoti kita programavimo kalba. Tiesą sakant, dauguma kalbų net nebus laikomi raktiniais žodžiais ilgą laiką ir nesudarys kodo, kuris jį naudoja.
  • FCL yra daug metodų, kurių pavadinimai yra jų metodų pavadinimų dalis. Pavyzdžiui, BinaryReader tipas siūlo tokius metodus kaip „ ReadBoolean“ , „ ReadInt32“ , „ ReadSingle“ ir pan., O „ System.Convert“ tipas siūlo tokius metodus kaip „ ToBoolean“ , „ ToInt32“ , „ ToSingle“ ir kt. Nors leidžiama parašyti šį kodą, man atrodo, kad plūduriuojančio taško eilutė yra nenatūrali ir nėra aišku, kad eilutė yra teisinga:
 BinaryReader br = new BinaryReader(...); float val = br.ReadSingle(); // OK, but feels unnatural Single val = br.ReadSingle(); // OK and feels good 

Taigi jūs turite tai. Manau, kad tai tikrai geros akimirkos. Tačiau aš nenaudoju Jeffrey patarimų savo kode. Galbūt aš perstrigau savo „C #“ pasaulyje, bet galų gale bandau, kad mano kodas atrodytų kaip sistema.

445
16 авг. Luko Fousto atsakymas 16 rug. 2008-08-16 02:00 '08, 2:00, 2008-08-16 02:00

string yra rezervuotas žodis, bet string yra tik klasės pavadinimas. Tai reiškia, kad string negali būti naudojama kaip kintamojo pavadinimas.

Jei dėl kokių nors priežasčių reikia kintamojo, pavadinto eilutę, pamatysite tik pirmąjį iš šių rinkinių:

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

Jei tikrai norite, kad kintamojo pavadinimas būtų vadinamas eilute, galite naudoti @ kaip priešdėlį:

 StringBuilder @string = new StringBuilder(); 

Kitas esminis skirtumas yra tas, kad kamino perpildymas juos pabrėžia skirtingai.

405
24 февр. atsakymas pateikiamas Simon_Weaver 24 vasaris. 2009-02-24 08:14 '09 8:14 am. 2009-02-24 08:14

Yra vienas skirtumas - negalite naudoti String be using System; iš anksto.

348
27 авг. atsakymą pateikė user3296 27 rug . 2008-08-27 21:21 '08, 9:21 val. 2008-08-27 21:21

Tai buvo peržiūrėta pirmiau; tačiau negalima naudoti atspindžio string ; turite naudoti string .

282
19 окт. TraumaPony 19 d. atsakymas . 2008-10-19 04:04 '08, 4:04 am 2008-10-19 04:04

System.String yra .NET klasės eilutė - „C #“ string yra „ System.String “ pseudonimas - todėl jie yra tokie patys, kaip ir naudodami.

Kalbant apie gaires, aš netaptų pernelyg susipynęs ir tiesiog naudoju tai, ko norite - gyvenime yra svarbesnių dalykų, ir bet kuriuo atveju kodas bus tas pats.

Jei pastebėsite, kad statote sistemas, kuriose reikia nurodyti naudojamų sveikųjų skaičių dydį, todėl jie linkę naudoti „ Int16 , „ Int32 , „ UInt16 , „ UInt32 ir tt, tada būtų natūraliau naudoti „ String - ir judant tarp different.net, tai gali padaryti ką suprantamesnę - priešingu atveju norėčiau naudoti eilutę ir int.

221
10 авг. atsakymas, kurį pateikė Ronnie 10 rug. 2008-08-10 10:26 '08 10:26 am. 2008-08-10 10:26

„Valters“, jūs negalite nustatyti pasaulinių slapyvardžių string , int ir tt stiliuje, kiek aš žinau. Tačiau, using raktinį žodį, tipus ir vardų sritis galite atlikti labiau lokalizuotai.

Pavyzdžiui.

 using str = System.String; using strDict = System.Collections.Generic.Dictionary<string, string>; //... str s = "Now you've got another alias for string!"; var d = new strDict(); 

Žr. Čia: naudojant direktyvą (nuoroda į C #)

193
10 авг. Atsakymą pateikė Derek Park 10 rug. 2008-08-10 11:17 '08 at 11:17 2008-08-10 11:17

Norėčiau, kad formatuojant būtų naudojami kapitalizuoti .NET tipai (o ne slapyvardžiai). .NET tipai yra dažomi taip pat, kaip ir kitų tipų objektai (galų gale jie yra vertės tipai).

Sąlyginiai ir kontroliniai raktiniai žodžiai (pvz., if , switch ir return ) turi mažas ir spalvotas mėlynas spalvas (pagal numatytuosius nustatymus). Ir aš nenorėčiau turėti skirtumų naudojimo ir formato.

Apsvarstykite:

183
03 сент. Atsakymą pateikė Anthony Mastrean 03 rugsėjis. 2008-09-03 21:58 '08, 21:58, 2008-09-03 21:58

string ir string visais atžvilgiais string identiški (išskyrus dideles raides „S“). Jokio poveikio našumui.

Mažosios raidės yra pageidautinos daugumoje projektų dėl sintaksės išryškinimo.

175
18 окт. Atsakymą pateikė TheSoftwareJedi 18 oct. 2008-10-18 19:50 '08 at 7:50 pm 2008-10-18 19:50

C # yra kalba, naudojama kartu su CLR.

string yra tipas C #.

System.String yra CLR tipas.

Naudojant C # kartu su CLR string , bus rodoma System.String .

Teoriškai galite įdiegti „C #“ kompiliatorių, kuris sukūrė „Java“ baitekodą. Tinkamas šio kompiliatoriaus įgyvendinimas greičiausiai java.> string į java.> kad galėtų sąveikauti su „Java“ vykdymo biblioteka.

162
17 марта '09 в 23:29 2009-03-17 23:29 atsakymą pateikė Rasmus Faber kovo 17 d., 09:29, 2009-03-17 23:29

Šiame „YouTube“ vaizdo įraše praktiškai rodoma, kiek jie skiriasi.

Bet dabar už ilgą teksto atsakymą.

Kai kalbame apie .NET , yra du skirtingi dalykai: yra .NET sistema, kita - kalbos ( C# , VB.NET ir tt), kurios naudoja šią infrastruktūrą.

2019

150
15 янв. atsakymą pateikė Shivprasad Koirala sausio 15 d. 2014-01-15 21:03 '14, 21:03 2014-01-15 21:03

string yra tik System.String . Kompiliatorius juos tvarkys taip pat.

Vienintelis praktinis skirtumas yra sintaksės išryškinimas, kaip tai paminėti ir ką turėtumėte rašyti using System jei naudojate string .

138
18 окт. Hallgrimo spalio 18 d. Atsakymas 2008-10-18 19:50 '08 at 7:50 pm 2008-10-18 19:50

Mažosios raidės yra System.String slapyvardis. Jie yra tokie patys C# .

Jame aptariama, ar naudoti sistemos tipus ( System.String , System.String ir kt.) Arba C# aliases ( int , string ir tt). Aš asmeniškai manau, kad turėtumėte naudoti „ C# aliases , bet tai tik mano asmeniniai pasirinkimai.

137
10 авг. atsakymas duotas urini 10 rug . 2008-08-10 10:27 '08, 10:27 am. 2008-08-10 10:27

Abu yra vienodi. Tačiau kodavimo vadovo požiūriu geriau naudoti string vietoj string . Štai ką paprastai naudoja kūrėjai. Pavyzdžiui, vietoj Int32 mes naudojame int , nes int yra Int32

FYI „Raktinių žodžių eilutė yra tik iš anksto nustatytos klasės„ System.StringSystem.String .“ - C kalbos specifikacija # 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx

125
18 окт. atsakymą pateikė Pradeep Kumar Mishra spalio 18 d. 2008-10-18 21:26 '08 21:26 2008-10-18 21:26

Kaip kiti sako, jie yra tokie patys. Pagal nutylėjimą „StyleCop“ taisyklės privers jus naudoti string kaip geriausią C # stiliaus kodo praktiką, išskyrus tuos atvejus, kai kalbama apie statines System.String funkcijas, pvz., String.Format , String.Join , String.Concat ir kt.

105
19 окт. Lloyd Cotten atsakymas, pateiktas spalio 19 d. 2008-10-19 04:15 '08, 4:15, 2008-10-19 04:15

Naudojant sistemos tipus, lengva perkelti tarp C # ir VB.Net, jei vadovaujate šiame.

85
22 сент. Atsakymas duotas Ishmael, rugsėjo 22 d. 2008-09-22 22:40 '08 10:40 pm 2008-09-22 22:40

Prieš tai, kas, atrodo, yra įprasta kitų programuotojų praktikoje, norėčiau pabrėžti tai, kad String yra nuoroda, kaip minėjo John Skit.

80
31 мая '11 в 14:20 2011-05-31 14:20 atsakymą pateikė RolandK gegužės 31 d. 11 val. 14.20 val. 2011-05-31 14:20

string yra slapyvardis (arba santrumpa) System.String . Tai reiškia, kad įvesdami string , mes System.String . Daugiau skaitykite psichologinėje nuorodoje: „eilutė“ yra „System.String“ slapyvardis / santrauka.

75
21 окт. JeeShen Lee atsakymas spalio 21 d 2011-10-21 04:10 '11, 4:10, 2011-10-21 04:10

String ( System.String ) yra klasė bazinės klasės bibliotekoje. eilutė (mažosios raidės) yra rezervuotas darbas „C #“, kuris yra „System.String“ slapyvardis. Int32 ir int yra tokie patys kaip Boolean vs. bool Boolean vs. bool . Šie „C #“ raktiniai žodžiai leidžia deklaruoti primityvų stilių, panašų į C.

67
15 янв. Joe Alfano atsakymas, pateiktas sausio 15 d 2012-01-15 01:51 '12 - 1:51 2012-01-15 01:51

String nėra raktinis žodis ir gali būti naudojamas kaip identifikatorius, o String yra raktinis žodis ir negali būti naudojama kaip identifikatorius. Ir funkciniu požiūriu jie abu yra vienodi.

61
25 апр. atsakymą pateikė vartotojo576533 25 balandis. 2011-04-25 09:06 '11 at 9:06 2011-04-25 09:06

Vėlyva šalis: aš naudoju CLR tipus 100% laiko (gerai, be to, jei naudoju C # tipą prievarta, bet neprisimenu, kada jis buvo paskutinis kartas).

Aš pradėjau tai daryti prieš daugelį metų, pasak Ritchie CLR knygų. Man buvo protinga, kad visos CLR kalbos turėtų galėti palaikyti CLR tipo rinkinį, todėl naudojant CLR tipus būtų užtikrintas aiškesnis ir galbūt pakartotinai naudojamas kodas.

Dabar, kai tai padariau jau daugelį metų, tai yra įprotis ir man patinka spalva, kurią VS rodo CLR tipams.

Vienintelis tikras nuosmukis yra tas, kad automatinis užbaigimas naudoja „C #“ tipą, todėl galų gale automatiškai generuojami tipai, norėdami nurodyti CLR tipą.

Be to, dabar, kai matau „int“ arba „eilutę“, tai man atrodo netinkamai, pavyzdžiui, aš žiūriu į 1970-ąjį kodą C.

61
24 авг. Michael Ray Lovett atsakymas rugpjūčio 24 d 2012-08-24 18:22 '12, 18:22 pm 2012-08-24 18:22

Aš tik norėčiau, kad tai būtų pridėta prie atsakymo „Ritchers“ atsakymų:

C # kalbos specifikacija rašoma taip: „Priklausomai nuo stiliaus, raktinio žodžio naudojimas yra tinkamesnis nei pilnas sistemos tipo pavadinimas.“ Nesutinku su kalbos specifikacija; Norėčiau naudoti FCL tipo pavadinimus ir visiškai išvengti primityvių tipų pavadinimų. Iš tiesų, atsiprašau, kad kompiliatoriai netgi nepasiūlė primityvių tipų pavadinimų ir priversti kūrėjus naudoti FCL tipo pavadinimus. Čia yra mano priežastys:

  • Aš mačiau, kad kai kurie kūrėjai supainioti, nežinodami, ar naudoti kodą ar eilutę . Kadangi C # (raktinis žodis) eilutė yra tiksliai susieta su System.String (tipo FCL), nėra jokio skirtumo ir gali būti naudojamas. Be to, aš girdėjau, kad kai kurie kūrėjai teigia, kad int yra 32 bitų sveikasis skaičius, kai programa veikia 32 bitų OS ir kad ji yra 64 bitų sveikasis skaičius, kai programa veikia 64 bitų OS. Šis teiginys yra visiškai neteisingas: C #, int visada siejamas su System.Int32 ir todėl yra 32 bitų sveikasis skaičius, nepriklausomai nuo OS, kuriame veikia kodas. Jei programuotojai savo Int32 naudoja savo kodą, ši galimo painiava taip pat bus pašalinta.

  • C #, ilgus žemėlapius į System.Int64 , bet kitoje programavimo kalba, ilgai gali rodyti Int16 arba Int32 . Iš tiesų, C + + / CLI yra ilgą laiką traktuojamas kaip Int32. Kažkas, kuri skaito šaltinio kodą vienoje kalboje, gali lengvai klaidingai suprasti kodų ketinimą, jei jis buvo naudojamas programuoti kita programavimo kalba. Tiesą sakant, dauguma kalbų netgi nemano ilgą laiką raktinio žodžio ir nesudarys kodo, kuris jį naudoja.

  • FCL turi daug metodų, kurių tipų pavadinimai yra jų metodų pavadinimų dalis. Pavyzdžiui, BinaryReader tipas siūlo tokius metodus kaip „ ReadBoolean“ , „ ReadInt32“ , „ ReadSingle“ ir pan., O „ System.Convert“ tipas siūlo tokius metodus kaip „ ToBoolean“ , „ ToInt32“ , „ ToSingle“ ir kt. Nors teisėta parašyti šį kodą, man atrodo, kad plūduriuojanti linija yra labai nenatūralu, ir nėra aišku, kad eilutė yra teisinga:

     BinaryReader br = new BinaryReader(...); float val = br.ReadSingle(); // OK, but feels unnatural Single val = br.ReadSingle(); // OK and feels good 
  • Daugelis C # programuotojų yra linkę pamiršti, kad kitos programavimo kalbos gali būti naudojamos prieš CLR, ir dėl to C # -ismai nuskaito į klasės bibliotekos kodą. Pavyzdžiui, „Microsoft FCL“ beveik išimtinai parašyta „C #“, o kūrėjai iš FCL komandos jau įdiegė bibliotekoje metodus, pvz., „ Array s“ GetLongLength , kuris grąžina Int64 reikšmę, kuri yra ilgesnė C #, bet ne kitomis kalbomis (pvz., [CN10] / CLI). Kitas pavyzdys yra „ System.Linq.Enumerable s LongCount“ metodas .

Aš nesulaukiau jo nuomonių, kol perskaičiau visą straipsnį.

60
28 янв. Atsakymas suteiktas claudioalpereira 28 sausis 2011-01-28 13:08 '11, 13:08, 2011-01-28 13:08

Tai iš tikrųjų yra konvencijos klausimas. string daugiau kaip C / C ++ stilius. Bendra konvencija yra naudoti bet kurią pasirinktą etiketę pasirinkta kalba (int / Int Int32 ). Tai taip pat taikoma „objektui“ ir decimal .

Teoriškai tai gali padėti koduoti kodą į būsimą 64 bitų standartą, kuriame „int“ gali reikšti „ Int64 , tačiau taip nėra, ir tikiuosi, kad bet kuris naujinimo vedlys pakeis int nuorodas į „ Int32 vis tiek būti saugūs.

53
18 авг. Atsakymas pateikiamas Mel 18 rug. 2008-08-18 20:58 '08 at 8:58 pm 2008-08-18 20:58

Nėra jokio skirtumo.

C # string raktinis žodis yra .NET System.String yra slapyvardis, palaikantis kalbų pavadinimo konvencijas.

Panašiai int susietas su System.Int32 .

46
15 янв. atsakymas buvo pateiktas Oded sausio 15 d 2012-01-15 01:47 '12 at 1:47 2012-01-15 01:47

Naujas atsakymas po 6 metų ir 5 mėnesių (vėlavimas).

Nors string yra rezervuotas C # raktinis žodis, kuris visada turi fiksuotą vertę, string yra tik įprastas identifikatorius, kuris gali būti susijęs su bet kuriuo. Priklausomai nuo dabartinio tipo narių, dabartinė vardų erdvė ir naudojamos direktyvos bei jų išdėstymas gali būti kita nei global::System.String vertė arba tipas.

Pateiksiu du pavyzdžius, kuriais using direktyvas nepadės.


Pirma, kai string yra dabartinio tipo (arba vietinio kintamojo) vertė:

 class MySequence<TElement> { public IEnumerable<TElement> String { get; set; } void Example() { var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek); } } 

Pirmiau minėti duomenys nebus sukompiliuoti, nes IEnumerable<> neturi IEnumerable<> nario, kurio pavadinimas yra Format , o išplėtimo metodai nenaudojami. Anksčiau minėtu atveju jūs vis tiek galite naudoti string kitose situacijose, kur tipas yra vienintelė galimybė sintaksiškai. Pavyzdžiui, String local = "Hi mum!"; gali būti tvarkingi (priklausomai nuo vardų ir direktyvų).

Хуже: высказывание String.Concat(someSequence) будет (в зависимости от using s) перейти к методу расширения 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" не может быть преобразовано в него.

43
ответ дан Jeppe Stig Nielsen 15 янв. '15 в 17:21 2015-01-15 17:21

Вот цитата из этой статьи из книга Даниэля Солиса .