Domanda

È questa la dichiarazione di funzione in C#:

void foo(string mystring)

come quello in C:

void foo(char *)

cioèIn C#, la funzione di chiamata visualizzato un puntatore dietro le quinte?

È stato utile?

Soluzione

In questo specifico esempio, è più simile a:

void foo(const char *);

.Net stringhe sono immutabili e passati per riferimento.Tuttavia, in generale, C# riceve un puntatore o un riferimento a un oggetto dietro le quinte.

Altri suggerimenti

Ci sono i puntatori dietro le quinte, in C#, anche se sono più come il C++i puntatori intelligenti, in modo che il raw puntatori sono incapsulati.Un char* non è proprio lo stesso Sistema.Stringa dal momento che un puntatore ad un char di solito significa l'inizio di un array di caratteri, e un C# stringa è un oggetto con un campo di lunghezza e un array di caratteri.Il puntatore che punta all'esterno della struttura che punti in qualcosa di simile a un wchar_t array, quindi c'è qualche riferimento indiretto con C# e di stringa di caratteri larghi per il supporto Unicode.

No.In C# (e tutti gli altri .NET languages) la Stringa è un hotel di prima classe tipo di dati.Non è semplicemente un array di caratteri.È possibile convertire avanti e indietro tra di loro, ma non hanno lo stesso comportamento.Ci sono un certo numero di metodi di manipolazione delle stringhe (come "Substring()" e "StartsWith") che sono disponibili per la classe String, non si applicano per le matrici in generale, che un array di caratteri è semplicemente un'istanza di.

Essenzialmente, sì.In C#, stringa (in realtà Sistema.Stringa) è un tipo di riferimento, in modo che quando foo() viene chiamato, si riceve un puntatore alla stringa nel mucchio.

Per i tipi di valore (int, double, etc.), la funzione riceve una copia del valore.Per altri oggetti, è un riferimento che punta all'oggetto originale.

Le stringhe sono speciali perché sono immutabili.Tecnicamente significa che passerà il riferimento, ma in pratica si comportano in modo molto simile ad un tipo di valore.

È possibile forzare i tipi di valore per passare un riferimento, utilizzando il ref parola chiave:

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

no in c# stringa unicode.in c# non è chiamato un puntatore, ma un punto di riferimento.

Se si intende il metodo di accesso al contenuto del carattere spazio, la risposta è sì.

Sì, perché una stringa è di dimensioni dinamico, quindi ci deve essere la memoria heap dietro le quinte

Tuttavia, essi NON sono gli stessi.

in c il puntatore punta a una stringa che può essere utilizzato anche altrove, pertanto la modifica non avrà effetto gli altri luoghi.

Per quanto ne so, tutte le classi in C# (non so gli altri) sono i tipi di riferimento.

Tutto ciò che non è un "tipo di valore", che copre essenzialmente enumerazioni, valori booleani, e built-in tipi numerici, saranno passati "da riferimento", che è probabilmente lo stesso del C/C++ meccanismo di passaggio per riferimento o puntatore.Sintatticamente e semanticamente è essenzialmente identico al C/C++ il passaggio per riferimento.

Si noti, tuttavia, che in C# le stringhe sono immutabili, quindi, anche se è passato per riferimento, non è possibile modificare la stringa senza crearne uno nuovo.

Anche notare che non è possibile passare un argomento come "const" in C#, indipendentemente dal fatto che si tratta di un tipo di valore o di un tipo di riferimento.

Mentre quelli sono infatti equivalenti in senso semantico (cioèil codice è fare qualcosa con una stringa), C#, Java, mantiene i puntatori completamente al di fuori del suo uso quotidiano, relegandoli ad aree come le transizioni nativo OS funzioni - anche allora, ci sono le classi del framework, che avvolgono quelle molto bene, come SafeFileHandle.

Lunga storia breve, non andare fuori del vostro modo di pensare dei puntatori in C#.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top