Vra

Voorbeeld (let wel die geval is):

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

Wat is die riglyne vir die gebruik van elkeen?En wat is die verskille?

Was dit nuttig?

Oplossing

string is 'n alias in C # vir System.String .
So tegnies, daar is geen verskil. Dis soos int vs. System.Int32 .

Sover riglyne, is dit oor die algemeen aanbeveel om te gebruik string enige tyd wat jy verwys na 'n voorwerp.

Bv.

string place = "world";

Net so, ek dink dit is oor die algemeen aanbeveel om String gebruik as jy nodig het om spesifiek verwys na die klas.

Bv.

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

Dit is die styl wat Microsoft is geneig om te gebruik in hul voorbeelde .

Dit wil voorkom asof die leiding in hierdie area kan verander, as StyleCop dwing nou die gebruik van die C # spesifieke aliasse.

Ander wenke

Net vir die wille van volledigheid, hier is'n brein dump van verwante inligting...

As die ander het opgemerk, string is'n alias vir System.String.Hulle stel om die dieselfde kode, so by die uitvoering tyd is daar geen verskil hoegenaamd.Dit is net een van die aliasse in C#.Die volledige lys is:

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

Afgesien van string en object, die aliasse is al om die waarde van tipes. decimal is'n tipe waarde, maar dit is nie'n primitiewe tipe in die CLR.Die enigste primitiewe tipe wat nie'n alias is System.IntPtr.

In die spec, die waarde tipe aliasse is bekend as "eenvoudige tipes".Vasgekodeerde kan gebruik word vir die konstante waardes van elke eenvoudige tipe;geen ander waarde tipes letterlike vorms beskikbaar.(Vergelyk dit met VB, wat toelaat dat die DateTime vasgekodeerde, en het'n alias vir dit ook.)

Daar is een omstandigheid in wat jy het gebruik die aliasse:wanneer uitdruklik vermelding van'n enum se onderliggende tipe.Byvoorbeeld:

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

Dit is net'n saak van die manier waarop die spec definieer enum verklarings - die deel na die kolon het om te wees die integrale-tipe die produksie, wat is'n teken van sbyte, byte, short, ushort, int, uint, long, ulong, char...eerder as om'n tipe produksie as wat gebruik word deur veranderlike verklarings vir die voorbeeld.Dit maak nie dui op enige ander verskil.

Ten slotte, wanneer dit kom by wat om te gebruik:ek persoonlik gebruik die aliasse oral vir die implementering daarvan, maar die CLR tipe vir enige APIs.Dit maak nie regtig saak nie te veel wat jy gebruik in terme van die implementering - konsekwentheid onder jou span is lekker, maar niemand anders is gaan om te sorg.Aan die ander kant, dit is werklik belangrik dat as jy verwys na'n tipe in'n API, jy doen in'n taal neutrale manier.'n metode genoem ReadInt32 is ondubbelsinnig, terwyl'n metode genoem ReadInt vereis interpretasie.Die oproeper kan word met behulp van'n taal wat definieer'n int alias vir Int16, byvoorbeeld.Die .NET framework ontwerpers het hierdie patroon, goeie voorbeelde wat in die BitConverter, BinaryReader en Convert klasse.

String staan vir System.String en dit is'n .NET Framework tipe. string is'n alias in die C# taal vir System.String.Beide van hulle is saamgestel om te System.String in IL (Intermediêre Taal), so daar is geen verskil nie.Kies wat jy wil, en gebruik dit.As jy die kode in C#, ek sou verkies om string as dit is'n C# tipe alias en goed bekend deur C# programmeerders.

Ek kan dieselfde sê oor (int, System.Int32) ens..

Die beste antwoord wat ek nog ooit gehoor het oor die gebruik van die tipe aliasse in C# kom van Jeffrey Richter in sy boek CLR Via C#.Hier is sy 3 redes:

  • Ek het gesien'n aantal van die ontwikkelaars verward, wat nie weet of om te gebruik string of String in hul kode.Want in C# die string ('n navraag) kaarte presies aan die Stelsel.String ('n FCL tipe), daar is geen verskil nie en óf gebruik kan word.
  • In C#, lank kaarte te Stelsel.Int64, nie , maar in'n ander programmeertaal, lank kon kaart om'n Int16 of Int32.In werklikheid, C++/CLI nie in die feit behandel lank as'n Int32.Iemand wat die lees van die bron-kode in een taal kan maklik verstaan die kode se bedoeling as hy of sy is gebruik om programmering in'n ander programmeertaal.In werklikheid, die meeste tale sal nie eens behandel lank as'n navraag en sal nie stel-kode wat gebruik maak van dit.
  • Die FCL het baie van die metodes wat die tipe name as deel van hul metode name.Byvoorbeeld, die BinaryReader tipe bied metodes soos ReadBoolean, ReadInt32, ReadSingle, en so aan, en die Stelsel.Skakel tipe bied metodes soos ToBoolean, ToInt32, ToSingle, en so aan.Hoewel dit is reg om te skryf die volgende kode, die lyn met die float voel baie onnatuurlik vir my, en dit is nie voor die hand liggend dat die lyn is korrek:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

So daar het jy dit.Ek dink dit is alles baie goeie punte.Ek het egter nie vind myself met behulp van Jeffrey se advies in my eie kode.Miskien is ek te vas in my C# wêreld, maar ek eindig probeer om te maak my kode lyk soos die raamwerk kode.

string is 'n gereserveerde woord, maar String is net 'n klas naam. Dit beteken dat string nie gebruik kan word as 'n veranderlike naam op sigself.

As vir een of ander rede wat jy 'n veranderlike genoem wou string , jy sien net die eerste van hierdie Versamel:

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

As jy regtig wil 'n veranderlike naam genoem string jy kan @ gebruik as 'n voorvoegsel:

StringBuilder @string = new StringBuilder();

Nog 'n kritieke verskil: Stack Overflow beklemtoon hulle anders.

Daar is 'n verskil -. Jy kan nie gebruik String sonder using System; vooraf

Dit is bo gedek is; egter, kan jy nie gebruik string in besinning; jy moet gebruik String.

System.String is die NET string klas - in C # string is 'n alias vir System.String - so in gebruik hulle dieselfde

.

As vir riglyne ek sou nie te verval en net te gebruik wat ook al jy voel soos - daar is meer belangrike dinge in die lewe en die kode gaan in elk geval dieselfde wees

.

As jy self bou stelsels waar dit nodig is om die grootte van die heelgetalle wat jy gebruik spesifiseer en so geneig om Int16, Int32, UInt16, UInt32 ens dan kan dit lyk meer natuurlik om String gebruik gebruik - en toe beweeg rondom tussen verskillende NET tale kan dit dinge meer verstaanbaar te maak -. anders sou ek string en int gebruik

Ek verkies om die gekapitaliseer tipes .NET (eerder as die aliasse) vir opmaak redes. Die tipes .NET gekleur dieselfde as ander vorme voorwerp (die tipes waarde is behoorlike voorwerpe, na alles).

Voorwaardelike en beheer sleutelwoorde (soos if, switch, en return) is klein en bruin donkerblou (by verstek). En Ek sal eerder nie die verskil in gebruik en formaat.

Oorweeg:

String someString; 
string anotherString; 

string en String is identies in alle opsigte (behalwe die hoofletters "S"). Daar is geen prestasie implikasies óf manier.

Kleine letter string verkies in die meeste projekte te danke aan die accentuering

C # is 'n taal wat saam gebruik word met die CLR.

string is 'n tipe in C #.

System.String is 'n tipe in die CLR.

As jy C # tesame met die CLR string sal gekarteer om System.String .

In teorie, kon jy 'n C # -compiler dat Java bytecode gegenereer implementeer. 'N sinvolle implementering van hierdie samesteller sal waarskynlik kaart string java.lang.String om versoenbaar met die Java Runtime biblioteek.

Dit YouTube video toon prakties hoe hulle verskil.

Maar nou vir 'n lang teks antwoord.

Wanneer ons praat oor .NET daar is twee verskillende dinge een daar is .NET raamwerk en die ander is daar tale (C#, VB.NET ens) wat daardie raamwerk te gebruik.

betree beeld beskrywing hier

"System.String" a.k.a "String" (hoofstad "S") is 'n .NET raamwerk tipe data, terwyl "string" is 'n C# data tipe.

betree beeld beskrywing hier

In kort "String" is 'n alias (dieselfde ding genaamd met verskillende name) van "string". So tegnies beide die onderstaande kode state sal dieselfde uitset gee.

String s = "I am String";

of

string s = "I am String";

Op dieselfde wyse is daar aliasse vir ander tipe c # data soos hieronder getoon: -

voorwerp: System.Object, string: System.String, Bool: System.Boolean, byte: System.Byte, sbyte: System.SByte, kort: System.Int16 en so aan

Nou die miljoen dollar vraag uit oogpunt programmeerder se So wanneer om "String" en "string" gebruik?

Eerste ding om te verhoed dat verwarring een van hulle konsekwent. Maar vanuit die perspektief van die beste praktyke wanneer jy veranderlike verklaring doen dit is goed om te gebruik "string" (klein "s") en wanneer jy gebruik dit as 'n klasnaam dan "String" (hoofstad "S") verkies word.

In die onderstaande kode die linkerkant is 'n veranderlike verklaring en dit verklaar die gebruik van "string". Aan die regterkant ons doen 'n beroep 'n metode so "String" is meer sinvol.

string s = String.ToUpper() ;

kleinletters string is 'n alias vir System.String. Hulle is dieselfde in C#.

Daar is 'n debat oor die vraag of jy die tipes System (System.Int32, System.String, ens) tipes of die C# aliases (int, string, ens) moet gebruik. Ek persoonlik glo moet jy die C# aliases gebruik, maar dit is net my persoonlike voorkeur.

string is net 'n alias vir System.String. Die samesteller sal hulle identies behandel.

Die enigste praktiese verskil is die accentuering as jy noem, en dat jy hoef te using System skryf as jy String gebruik.

Albei is dieselfde.Maar van kodering riglyne perspektief dit is beter om te gebruik string in plaas van String.Dit is wat oor die algemeen ontwikkelaars gebruik.bv.in plaas van die gebruik van Int32 ons gebruik int as int is alias te Int32

FYI "Die navraag string is net'n alias vir die gedefinieerde klas System.String." - C# Taal Spesifikasie 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx

As die ander sê, hulle is dieselfde. StyleCop reëls, by verstek, sal dwing jou om string gebruik as 'n C # kode styl beste praktyk, behalwe wanneer verwysing System.String statiese funksies, soos String.Format, String.Join, String.Concat, ens ...

Nuwe antwoord na 6 jaar en 5 maande (uitstel).

Terwyl string is'n voorbehou C# navraag wat altyd'n vaste betekenis, String is net'n gewone identifiseerder wat kan verwys na enigiets.Afhangende van die lede van die huidige tipe, die huidige namespace en die toegepaste using riglyne en hul plasing, String kan'n waarde of'n tipe onderskei van global::System.String.

Ek sal verskaf twee voorbeelde waar using riglyne sal nie help nie.


Eerste, wanneer String is'n waarde van die huidige tipe (of'n plaaslike veranderlike):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

Die bogenoemde sal nie saam te stel, want IEnumerable<> nie'n nie-statiese lid genoem Format, nie , en geen uitbreiding metodes toe te pas.In die bogenoemde geval, mag dit steeds moontlik wees om te gebruik String in ander kontekste waar'n tipe is die enigste moontlikheid sintakties.Byvoorbeeld String local = "Hi mum!"; kan OK wees (afhangende van namespace en using riglyne).

Erger:Sê String.Concat(someSequence) sal waarskynlik (afhangende van usings), gaan na die Linq uitbreiding metode Enumerable.Concat.Dit sal nie gaan na die statiese metode string.Concat.


Tweedens, wanneer String is'n ander tipe, geneste binne die huidige tipe:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Geen stelling in die Example metode stel.Hier String is altyd'n klavier string, MyPiano.String.Geen lid (static of nie) Format bestaan op dit (of is geërf het van sy basis klas).En die waarde "Goodbye" kan nie omskep word in dit.

Die gebruik van System tipes maak dit makliker om die hawe tussen C # en VB.Net, as jy in daardie soort van ding.

Teen watter lyk algemene praktyk onder programmeerders wees, ek verkies String oor string, net om die feit dat String is 'n verwysing tipe, soos Jon kleiduiven genoem na vore te bring.

string is 'n alias (of snelskrif) van System.String. Dit beteken, deur te tik string bedoel ons System.String. Jy kan meer in think skakel lees: 'string' is 'n alias / snelskrif van System.String.

String (System.String) is 'n klas in die basis klas biblioteek. string (kleinletters) is 'n gereserveerde werk in C # wat is 'n alias vir System.String. Int32 vs int is 'n soortgelyke situasie as is Boolean vs. bool. Hierdie C # taal spesifieke sleutelwoorde in staat stel om primitiewes in 'n styl soortgelyk aan C. verklaar

Ek wil net graag by te voeg om dit te lfousts antwoord, van Ritchers boek:

Die C# taal spesifikasie state, "As'n saak van die styl, die gebruik van die navraag is bevoordeel oor gebruik van die volledige stelsel tik die naam." Ek het nie eens met die taal spesifikasie;Ek verkies gebruik die FCL tipe name en heeltemal vermy die primitiewe tipe name.In werklikheid, ek wens dat samestellers het nie eens bied die primitiewe tipe name en gedwing om ontwikkelaars om te gebruik die FCL tipe name plaas.Hier is my redes:

  • Ek het gesien'n aantal van die ontwikkelaars verward, wat nie weet of om te gebruik string of String in hul kode.Want in C# string ('n navraag) kaarte presies te Stelsel.String ('n FCL tipe), daar is geen verskil nie en óf gebruik kan word.Net so, Ek het gehoor dat sommige ontwikkelaars sê dat int verteenwoordig'n 32-bit heelgetal wanneer die aansoek loop op'n 32-bit OS en wat dit verteenwoordig'n 64-bit heelgetal wanneer die aansoek loop op'n 64-bit OS.Hierdie stelling is absoluut vals:in C#, 'n int altyd kaarte om te Stelsel.Int32, en daarom is dit verteenwoordig'n 32-bit heelgetal ongeag van die OS die kode loop op.As programmeerders sou gebruik Int32 in hul kode, dan is hierdie potensiaal verwarring is ook uitgeskakel.

  • In C#, lank kaarte te Stelsel.Int64, nie , maar in'n ander programmeertaal, lank kon kaart om'n Int16 of Int32.In werklikheid, C++/CLI nie behandel lank as'n Int32.Iemand wat die lees van die bron-kode in een taal kan maklik verstaan die kode se voorneme indien hy of sy was wat gebruik word om te programmering in'n ander programmeertaal.In werklikheid, die meeste tale sal nie eens behandel lank as'n navraag en sal nie stel kode wat gebruik maak van dit.

  • Die FCL het baie van die metodes wat die tipe name as deel van hul metode name.Vir byvoorbeeld, die BinaryReader tipe bied metodes soos ReadBoolean, ReadInt32, ReadSingle, en so aan, en die Stelsel.Skakel tipe bied metodes soos ToBoolean, ToInt32, ToSingle, en so aan.Hoewel dit is reg om te skryf die volgende kode, die lyn met dryf voel baie onnatuurlik vir my, en dit is nie voor die hand liggend dat die lyn is korrek is:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • Baie programmeerders wat gebruik C# uitsluitlik is geneig om te vergeet dat ander programme tale kan gebruik word teen die CLR, en as gevolg van hierdie, C#-ismes kruip in die klas biblioteek-kode.Byvoorbeeld, Microsoft se FCL is byna uitsluitlik geskryf is in C# en ontwikkelaars op die FCL span het nou ingestel metodes in die biblioteek soos Skikking's GetLongLength, wat opbrengste'n Int64 waarde wat is'n lank in C#, maar nie in ander tale (soos C++/CLI).Nog'n voorbeeld is Stelsel.Linq.Enumerable's LongCount metode.

Ek het nie sy mening, voordat ek lees die volledige paragraaf.

String is nie 'n navraag en dit kan gebruik word as Identifier terwyl string is 'n navraag en kan nie gebruik word as Identifier. En in funksie oogpunt beide is dieselfde.

laat kom om die party Ek gebruik die tipes CLR 100% van die tyd (wel, behalwe as gedwing om die C # tipe gebruik, maar ek kan nie onthou wanneer laas was dit ).

Ek het oorspronklik begin om dit te doen jaar gelede, volgens die CLR boeke deur Ritchie. Dit het vir my sin dat alle CLR tale het uiteindelik in staat wees om die stel van CLR tipes ondersteun, sodat die gebruik van die tipes CLR jouself verskaf duideliker, en moontlik meer "herbruikbare" kode.

Nou dat ek dit gedoen het vir die jaar, is dit 'n gewoonte en ek hou van die kleur wat VS toon vir die tipes CLR.

Die enigste ware Downer is dat die motor-volledige gebruik die C # tipe, sodat ek uiteindelik weer tik outomaties gegenereer tipes om die CLR tipe plaas spesifiseer.

Ook, nou, toe ek sien "int" of "string", dit lyk net regtig verkeerd om my, soos ek is op soek na 1970 se C-kode.

Dit is 'n kwessie van konvensie, regtig. string lyk net meer soos C / C ++ styl. Die algemene konvensie is om te gebruik wat ookal kortpaaie jou gekose taal (vir Int32 int / Int) verskaf. Dit geld vir "voorwerp" en decimal sowel.

Teoreties kan dit help om die hawe-kode in 'n toekomstige 64-bit standaard waarin "int" kan beteken Int64, maar dit is nie die punt, en ek sou enige opgradering towenaar verwag om enige int verwysings verander in elk geval Int32 net te wees veilig.

Daar is geen verskil.

Die C # navraag string kaarte om die NET tipe System.String - dit is 'n alias wat hou om die benoemings konvensies van die taal

.

Net so, int kaarte te System.Int32.

Daar is 'n aanhaling oor hierdie kwessie van boek Daniël Solis '.

  

Al die gedefinieerde tipes is direk koppel aan   onderliggende NET tipes. Die C # tipe name (string) is eenvoudig aliasse vir die   NET tipes (String of System.String), so gebruik te maak van die NET name werk goed sintakties, hoewel   hierdie is moedeloos. Binne 'n C # program, moet jy die C # name gebruik   eerder as om die NET name.

string is 'n navraag, en jy kan nie gebruik string as 'n identifiseerder.

String is nie 'n navraag, en jy kan dit gebruik as 'n identifiseerder:

Voorbeeld

string String = "I am a string";

Die navraag string is 'n alias vir  System.String opsy, weg van die navraag kwessie, die twee is presies  ekwivalent.

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

Ja, dit is geen verskil tussen hulle, net soos die bool en Boolean.

Daar is geen verskil tussen die twee -. string egter blykbaar die voorkeuropsie wees by die oorweging van ander ontwikkelaars se bronkode

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top