Wat is die verskil tussen die Tou en die string in C#?
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?
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.
"System.String
" a.k.a "String" (hoofstad "S") is 'n .NET
raamwerk tipe data, terwyl "string" is 'n C#
data tipe.
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 using
s), 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