Question

Cette déclaration de fonction est-elle en C #:

void foo(string mystring)

identique à celui-ci dans C:

void foo(char *)

i.e. En C #, la fonction appelée reçoit-elle un pointeur en coulisse?

Était-ce utile?

La solution

Dans ce cas précis, cela ressemble plus à:

void foo(const char *);

Les chaînes .Net sont immuables et transmises par référence. Cependant, en général, C # reçoit un pointeur ou une référence à un objet dans les coulisses.

Autres conseils

Il y a des pointeurs dans les coulisses de C #, bien qu'ils ressemblent davantage aux pointeurs intelligents de C ++, les pointeurs bruts sont donc encapsulés. Un caractère * n'est pas vraiment identique à System.String puisqu'un pointeur sur un caractère signifie généralement le début d'un tableau de caractères et qu'une chaîne C # est un objet avec un champ de longueur et un tableau de caractères . Le pointeur pointe sur la structure externe qui pointe vers un tableau semblable à un tableau wchar_t . Il existe donc une indirection avec une chaîne C # et des caractères plus larges pour le support Unicode.

Non. En C # (et tous les autres langages .NET), String est un type de données de première classe. Ce n'est pas simplement un tableau de caractères. Vous pouvez effectuer des conversions entre eux, mais ils ne se comportent pas de la même manière. Il existe un certain nombre de méthodes de manipulation de chaînes (telles que "Substring ()" et "StartsWith") disponibles pour la classe String, qui ne s'appliquent pas aux tableaux en général, où un tableau de caractères est simplement une instance. de.

Essentiellement, oui. En C #, string (en fait, System.String) est un type de référence. Ainsi, lorsque foo () est appelé, il reçoit un pointeur sur la chaîne du tas.

Pour les types de valeur (int, double, etc.), la fonction reçoit une copie de la valeur. Pour d'autres objets, il s'agit d'une référence pointant sur l'objet d'origine.

Les chaînes sont spéciales car elles sont immuables. Techniquement, cela signifie qu'il passera la référence, mais en pratique, il se comportera plus ou moins comme un type de valeur.

Vous pouvez forcer les types de valeur à transmettre une référence à l'aide du mot clé ref :

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

non, la chaîne c # est unicode. en c #, cela ne s'appelle pas un pointeur, mais une référence.

Si vous voulez dire - la méthode sera-t-elle autorisée à accéder au contenu de l'espace de caractères, la réponse est oui.

Oui, car une chaîne a une taille dynamique, il doit donc y avoir de la mémoire heap en coulisse

Cependant, ils ne sont pas identiques.

dans c, le pointeur pointe sur une chaîne qui peut également être utilisée ailleurs. Par conséquent, si vous le modifiez, les autres emplacements seront affectés.

Pour autant que je sache, toutes les classes en C # (pas sûres des autres) sont des types de référence.

Tout ce qui n'est pas un "type valeur", qui couvre essentiellement les énums, les booléens et les types numériques intégrés, sera passé "par référence", ce qui est sans doute identique au mécanisme de transmission C / C ++. par référence ou pointeur. Syntaxiquement et sémantiquement, il est essentiellement identique au C / C ++, qui passe par référence.

Notez cependant que, dans C #, les chaînes sont immuables. Ainsi, même si elles sont passées par référence, vous ne pouvez pas éditer la chaîne sans en créer une nouvelle.

Notez également que vous ne pouvez pas transmettre d’argument sous la forme "" const". en C #, qu'il s'agisse d'un type de valeur ou d'un type de référence.

Bien que ceux-ci soient effectivement équivalents sur le plan sémantique (le code utilise quelque chose avec une chaîne), C #, comme Java, maintient les pointeurs complètement hors de son utilisation quotidienne, les reléguant à des domaines tels que les transitions vers les fonctions natives du système d'exploitation - même dans ce cas, il existe des classes de framework qui les encapsulent bien, telles que SafeFileHandle.

Bref, ne vous gênez pas pour penser aux pointeurs en C #.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top