4 Stimmen

C-Zeiger in C#

Ist diese Funktionsdeklaration in C#:

void foo(string mystring)

dasselbe wie dieses in C:

void foo(char *)

d.h. erhält die aufgerufene Funktion in C# einen Zeiger hinter den Kulissen?

12voto

user7116 Punkte 61589

In diesem speziellen Fall ist es eher so:

void foo(const char *);

.Net-Strings sind unveränderlich und werden per Referenz übergeben. Im Allgemeinen erhält C# jedoch einen Zeiger oder Verweis auf ein Objekt hinter den Kulissen.

5voto

Mark Cidade Punkte 95914

Es gibt Zeiger hinter den Kulissen in C#, obwohl sie mehr wie C++'s intelligente Zeiger sind, so dass die rohen Zeiger gekapselt sind. Ein char* ist nicht wirklich dasselbe wie System.String, da ein Zeiger auf ein char normalerweise den Anfang eines Zeichenarrays bedeutet, und ein C#-String ist ein Objekt mit einem Längenfeld et ein Zeichen-Array. Der Zeiger zeigt auf die äußere Struktur, die auf etwas wie eine wchar_t Array, so gibt es einige Umleitung mit einem C#-String und breitere Zeichen für Unicode-Unterstützung.

5voto

Bob King Punkte 24518

Nein. In C# (und allen anderen .NET-Sprachen) ist der String ein Datentyp erster Klasse. Er 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 Methoden zur Stringmanipulation (z. B. "Substring()" und "StartsWith"), die der String-Klasse zur Verfügung stehen, die aber nicht für Arrays im Allgemeinen gelten, von denen ein Array von Zeichen einfach eine Instanz ist.

4voto

Nate Kohari Punkte 2198

Im Grunde genommen, ja. In C# ist String (eigentlich System.String) ein Referenztyp. Wenn also foo() aufgerufen wird, erhält es einen Zeiger auf den String im Heap.

3voto

David Thibault Punkte 8318

Bei Werttypen (int, double usw.) erhält die Funktion eine Kopie des Wertes. Bei anderen Objekten ist es eine Referenz, die auf das ursprüngliche Objekt verweist.

Strings sind etwas Besonderes, weil sie unveränderlich sind. Technisch gesehen bedeutet dies, dass die Referenz weitergegeben wird, aber in der Praxis verhält sie sich ziemlich genau wie ein Wertetyp.

Sie können Werttypen dazu zwingen, eine Referenz zu übergeben, indem Sie die ref Stichwort:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X