C pekere i C #

stemmer
4

Er denne funksjonen erklæring i C #:

void foo(string mystring)

den samme som denne i C:

void foo(char *)

dvs. i C #, ikke kalles funksjonen mottar en peker bak kulissene?

Publisert på 15/09/2008 klokken 16:58
kilden bruker
På andre språk...                            


11 svar

stemmer
11

I dette konkrete tilfellet, er det mer som:

void foo(const char *);

Net strenger er uforanderlig og bestått ved henvisning. Men generelt C # mottar en peker eller en referanse til en gjenstand bak kulissene.

Svarte 15/09/2008 kl. 17:01
kilden bruker

stemmer
4

No. IC # (og alle andre NET språk) String er en førsteklasses datatype. Det er ikke bare en rekke tegn. Du kan konvertere frem og tilbake mellom dem, men de oppfører seg ikke det samme. Det finnes en rekke strengmanipulering metoder (som "understreng ()" og "starts") som er tilgjengelige for String klassen, noe som ikke gjelder for matriser Generelt, som en oppstilling av figurene er bare et eksempel på.

Svarte 15/09/2008 kl. 17:06
kilden bruker

stemmer
4

Det er pekere bak kulissene i C #, selv om de er mer som C ++ 's smarte tips, så rå pekere er innkapslet. En char * er egentlig det samme som System.String siden en peker til en forkullet vanligvis betyr begynnelsen av et tegn matrise, og en C # streng er en gjenstand med en lengde felt og et tegn array. Pekeren peker til den ytre strukturen som peker til en slags wchar_t matrise, slik at det er noe mindre omvei med en C # streng og bredere tegn for Unicode støtte.

Svarte 15/09/2008 kl. 17:03
kilden bruker

stemmer
3

I hovedsak, ja. I C #, streng (faktisk System.String) er en referanse-type, slik at når foo () kalles, den mottar en peker til strengen i haugen.

Svarte 15/09/2008 kl. 17:00
kilden bruker

stemmer
2

For verdityper (int, dobbel, etc.), det funksjons får en kopi av verdien. For andre gjenstander, er det en referanse som peker til den opprinnelige objektet.

Strenger er spesielle fordi de er uforanderlige. Teknisk sett betyr det at det vil passere referanse, men i praksis vil det oppføre seg ganske mye som en verditype.

Du kan tvinge verdityper å passere en referanse ved hjelp av refsøkeord:

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}
Svarte 15/09/2008 kl. 17:02
kilden bruker

stemmer
0

Mens de er faktisk tilsvarende i en semantisk forstand (dvs. koden gjør noe med en streng), C #, som Java, holder pekere helt ut av sin daglige bruk, henvise dem til områder som overganger til innfødte OS funksjoner - selv da, det er ramme klasser som brytes de opp pent, for eksempel SafeFileHandle.

Lang historie kort, ikke gå ut av din måte å tenke på pekere i C #.

Svarte 15/09/2008 kl. 17:50
kilden bruker

stemmer
0

Noe som ikke er en "verdi type", som i hovedsak dekker enums, booleans, og innebygget i talltyper, vil bli vedtatt "med referanse", som utvilsomt er den samme som C / C ++ mekanisme for å overføre ved referanse eller pekeren. Syntaktisk og semantisk er det vesentlig identisk med C / C ++ passerer ved referanse.

Vær imidlertid oppmerksom på at det i C # strenger er uforanderlig, så selv om det er gått med referanse du kan ikke endre strengen uten å lage en ny.

Legg også merke til at du ikke kan passere et argument som "const" i C #, uansett om det er en verditype eller en referansetype.

Svarte 15/09/2008 kl. 17:27
kilden bruker

stemmer
0

Så vidt jeg vet, alle klasser i C # (ikke sikker på om de andre) er referansetyper.

Svarte 15/09/2008 kl. 17:12
kilden bruker

stemmer
0

Ja, fordi en streng er dynamisk størrelse, så det må være heap minne bak kulissene

Men de er ikke det samme.

i c pekeren peker til en streng som også kan benyttes et annet sted, så endrer det vil påvirke de andre steder.

Svarte 15/09/2008 kl. 17:02
kilden bruker

stemmer
0

Hvis du mener - vil metoden få lov til å få tilgang til innholdet av karakteren plass, er svaret ja.

Svarte 15/09/2008 kl. 17:02
kilden bruker

stemmer
0

ingen i C # strengen er unicode. i C # det ikke kalles en peker, men en referanse.

Svarte 15/09/2008 kl. 17:01
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more