web-dev-qa-db-fra.com

Existe-t-il un pointeur en C # comme C ++? Est-ce sûr?

J'écris une application qui fonctionne avec une structure de données arborescente. Je l'ai écrit avec C++, maintenant je veux l'écrire en C #. J'utilise des pointeurs pour implémenter la structure de données arborescente. Existe-t-il également un pointeur en C #? Est-il sûr de l'utiliser?

44
masoud ramezani

Si vous implémentez une structure arborescente en C # (ou Java, ou de nombreux autres langages), vous utiliseriez des références au lieu de pointeurs. NB. les références en C++ ne sont pas les mêmes que ces références.

L'utilisation est similaire aux pointeurs pour la plupart, mais il y a des avantages comme la collecte des ordures.

class TreeNode
{
    private TreeNode parent, firstChild, nextSibling;

    public InsertChild(TreeNode newChild)
    {
        newChild.parent = this;
        newChild.nextSibling = firstChild;
        firstChild = newChild;
    }
}

var root = new TreeNode();
var child1 = new TreeNode();
root.InsertChild(child1);

Points d'interêts:

  • Pas besoin de modifier le type avec * lors de la déclaration des membres
  • Pas besoin de les mettre à null dans un constructeur (ils sont déjà null)
  • Pas de SPÉCIAL -> opérateur pour l'accès des membres
  • Pas besoin d'écrire un destructeur (bien que chercher IDisposable)
41
Daniel Earwicker

[~ # ~] oui [~ # ~] . Il existe des pointeurs en C #.

[~ # ~] non [~ # ~] . Ils ne sont [~ # ~] pas [~ # ~] sûrs.

Vous devez en fait utiliser le mot clé unsafe lorsque vous utilisez des pointeurs en C #.

Pour des exemples, regardez ici et MSDN .

static unsafe void Increment(int* i)
{
    *i++;
}

Increment(&count);

Utilisez-le à la place et le code sera SÛR et PROPRE.

static void Increment(ref int i)
{
    i++;
}

Increment(ref count);
32
Pratik Deoghare

Y a-t-il aussi un pointeur en C #?

Oui , déclaré en utilisant la syntaxe int* varName;.

L'usage de ce coffre-fort?

Aucun pointeur n'est dangereux .

Il existe des moyens sûrs de construire une structure de données sans pointeurs. Si les nœuds sont des classes, alors ils seront automatiquement types de référence donc vous n'avez pas besoin de pointeurs. Sinon, vous pouvez les encadrer dans une référence .

19
kennytm
4
Tuomas Hietanen

Il existe une grande série de structures de données implémentées dans .Net 2 sur MSDN.

Structures de données, partie 1

Ils incluent un exemple de code pour des choses comme l'arbre de recherche binaire, le graphique, la SkipList, la NodeList, etc. Le code est assez complet et comprend un certain nombre de pages de documents sur les raisons pour lesquelles ces structures fonctionnent, etc.

Aucun de ceux de Microsoft n'utilise de pointeurs. En général, vous n'avez jamais besoin de les utiliser en C #. Il y a des moments où les utiliser serait bien, ou ils sont juste la façon dont vous pensez du C++. Mais vous pouvez généralement trouver un moyen de ne pas les utiliser.

La principale raison pour laquelle vous ne devez pas utiliser de code dangereux pour les pointeurs est que vous perdez la conformité Medium Trust. Vous ne pouvez pas exécuter des mécanismes tels que cliquer une fois, les sites Web asp.net et Silverlight ne les autorise pas non plus. Respectez les références et les concepts entièrement gérés pour vous assurer que votre code peut s'exécuter dans plus d'endroits.

2
Jason Short