Y a-t-il un pointeur dans C# comme C++? Est-il sûr?

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

42
demandé sur Sam 2010-02-25 14:26:16

5 réponses

si vous implémentez une structure arborescente en C# (ou Java, ou beaucoup d'autres langues), vous utiliserez 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'usage 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'intérêt:

  • Pas besoin de modifier le type * lors de la déclaration des membres
  • pas besoin de les définir à null dans un constructeur (ils sont déjà null)
  • Aucun -> opérateur pour l'accès des membres
  • Pas besoin d'écrire un destructeur (regardez bien IDisposable)
39
répondu Daniel Earwicker 2010-02-25 12:03:01

Oui. Il y a des indices dans C#.

NO. Ils sont coffre-fort.

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

Pour des exemples de look ici et MSDN.

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

Increment(&count);

utilisez ceci à la place et le code sera sûr et propre.

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

Increment(ref count);
29
répondu Pratik Deoghare 2010-02-25 11:51:26

pointeur en C#?

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

l'utilisation de ce coffre-fort est-elle sécuritaire?

aucun pointeur n'est pas sûr.

Il existe des moyens sûrs pour construire une structure de données sans pointeurs. Si les noeuds sont des classes, alors ils seront automatiquement types de référence si vous n'avez pas besoin de pointeurs. Sinon, vous pouvez boîte dans une référence.

18
répondu kennytm 2017-11-02 13:10:35

il y a une grande série de Structures de données implémentées dans .Net 2 sur MSDN.

Structures Des Données Partie 1

ils incluent un exemple de code pour des choses comme L'arborescence de recherche binaire, le graphe, La SkipList, NodeList, etc. Le code est très complet et comprend un certain nombre de pages de documents expliquant pourquoi 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 dans C#. Il y a des moments lors de leur utilisation ce serait sympa, ou ils sont exactement comme vous le pensez à partir de C++. Mais vous pouvez généralement trouver un moyen de ne pas les utiliser.

les principales raisons pour lesquelles vous ne pouvez pas utiliser le code dangereux pour les pointeurs sont que vous perdez la conformité de confiance moyenne. Vous ne pouvez pas passer par des mécanismes comme cliquer une fois, asp.net les sites Web, et Silverlight ne les autorise pas non plus. Tenez-vous avec des références et des concepts entièrement gérés pour s'assurer que votre code peut fonctionner dans plus d'endroits.

2
répondu Jason Short 2010-02-25 16:54:37