Frage

Ist diese Funktion Deklaration in C #:

void foo(string mystring)

die gleichen wie dieser in C:

void foo(char *)

d. In C #, wird die genannte Funktion einen Zeiger hinter den Kulissen erhalten?

War es hilfreich?

Lösung

In diesem speziellen Fall ist es eher wie:

void foo(const char *);

NET-Strings sind unveränderlich und durch Verweis übergeben. Aber im Allgemeinen C # einen Zeiger oder eine Referenz auf ein Objekt empfängt hinter den Kulissen.

Andere Tipps

Es gibt Zeiger hinter den Kulissen in C #, obwohl sie eher wie C ++ 's intelligente Zeiger sind, so werden die rohen Zeiger eingekapselt. Ein char * ist nicht wirklich die gleiche wie System.String da ein Zeiger auf ein Zeichen in der Regel bedeutet den Beginn eines Zeichenfeldes und ein C # String ist ein Objekt mit einem Längenfeld und ein Zeichenarray . Der Zeiger zeigt auf die äußere Struktur, die wie etwas weist in eine Wchar_t Array, so gibt es einige indirection mit einem C # String und breitere Zeichen für Unicode-Unterstützung.

Nein. In C # (und alle anderen .NET-Sprachen) ist der String ein First-Class-Datentyp. Es ist nicht einfach ein Array von Zeichen. Sie können zwischen ihnen hin und her konvertieren, aber sie verhalten sich nicht gleich. Es gibt eine Reihe von String-Manipulationsmethoden (wie „Substring ()“ und „Starts“), die die String-Klasse zur Verfügung stehen, die in der Regel auf Arrays nicht gelten, die eine Reihe von Zeichen ist einfach eine Instanz.

Im Wesentlichen ja. In C #, string (eigentlich System.String) ist ein Referenz-Typ, so dass, wenn foo () aufgerufen wird, erhält es einen Zeiger auf den String in der Halde.

Für Werttypen (int, double, etc.), erhält die Funktion eine Kopie des Wertes. Für andere Objekte, ist es ein Verweis auf das ursprüngliche Objekt zeigt.

Strings sind etwas Besonderes, weil sie unveränderlich sind. Technisch bedeutet dies, es wird die Referenz zu übergeben, aber in der Praxis wird es so ziemlich verhält sich wie ein Werttyp.

Sie können Wertetypen zwingen, eine Referenz zu übergeben, indem Sie das ref Schlüsselwort:

public void Foo(ref int value) { value = 12 }
public void Bar()
{
    int val = 3;
    Foo(ref val);
    // val == 12
}

nicht in c # String ist Unicode. in c # ist es nicht einen Zeiger, sondern eine Referenz.

genannt

Wenn Sie meinen, - wird die Methode den Inhalt des Zeichenraum zugreifen dürfen, die Antwort ja ist.

Ja, weil eine Reihe von dynamischer Größe ist, so muss es Heap-Speicher sein, hinter den Kulissen

Allerdings sind sie nicht gleich.

in c der Zeiger auf eine Zeichenfolge, die auch an anderer Stelle verwendet werden können, so ändert es die anderen Stellen bewirken.

Soweit ich weiß, sind alle Klassen in C # (nicht sicher über die anderen) sind Referenztypen.

Alles, was nicht ein „Werttyp“ ist, der im wesentlichen enums, booleans abdeckt und integrierten numerischen Typen, wird „by reference“ übergeben wird, die als C / C ++ Mechanismus der Weitergabe durch Bezugnahme wohl die gleichen oder einen Zeiger. Syntaktisch und semantisch es ist im Wesentlichen identisch mit C / C ++ unter Bezugnahme geben.

Beachten Sie jedoch, dass in C # Strings sind unveränderlich, so dass, obwohl es durch Referenz übergeben wird können Sie die Zeichenfolge nicht bearbeiten, ohne einen neuen zu erstellen.

Beachten Sie auch, dass Sie nicht ein Argument als „const“ in C # passieren kann, unabhängig davon, ob es sich um ein Werttyp oder ein Referenztyp ist.

Während die in der Tat äquivalent in einem semantischen Sinne sind (dh des Code etwas mit einer Schnur tut), C #, wie Java, hält Zeiger vollständig aus seinem täglichen Gebrauch, so dass sie auf Bereiche wie Übergänge zu nativen OS-Funktionen verbannen - selbst dann gibt es Framework-Klassen, die wickeln jene oben schön, wie Safefilehandle.

Lange Rede kurzer Sinn, gehen nicht aus dem Weg Denken von Zeigern in C #.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top