9
votes

C # - Wrapper de référence pour type valeur

Je veux utiliser c # point comme type de référence (c'est une structure). J'ai pensé avoir une classe cpoint , qui contiendrait un membre point . Y a-t-il un moyen de soulever les membres du point pour agir en tant que membres du cpoint . J'essaie d'éviter xxx

je voudrais faire xxx

ainsi que garder toutes les conversions, les opérateurs, vide , etc.
Peut-il facilement être fait?


6 commentaires

Pourquoi voulez-vous / besoin d'une telle enveloppe?


@ Xint0 comme je l'ai dit, de l'utiliser comme type de référence.


@Barunch: Avant de le faire, considérons que Il y a une raison pourquoi ce type de types simples a été défini comme un structs . L'un d'entre eux est que struct est très rapide dans l'allocation et Point STRIT utilisé dans les méthodes de dessin, où la vitesse d'attribution et de libération peut être cruciale.


@Tigran qui est vrai. Je n'utilise pas cela pour dessiner, cependant. J'utilise aussi (et taille aussi) comme propriétés de ma classe, non utilisée dans le dessin. Je veux être capable de faire myclass.pos.x = 10 et des choses similaires.


@Barunch: Donc, si vous avez besoin d'un espace réservé Créez une classe simple et ne pas s'enraciner. Peut-être même, si vous avez besoin, pour une transformation facile vers / depuis la struct de la structure de point définit également les opérateurs de coulée implicites.


@baruch - J'ai édité ma réponse basée sur votre commentaire à propos de l'accès via myClass.pos.x = 10


3 Réponses :


5
votes

Je pense que le seul moyen est de réécrire et de transmettre toutes les propriétés, opérateurs et méthodes, comme ceci: xxx

(le changement de nom de classe est destiné; Cpoint n'est pas très expressif.)


4 commentaires

Bien sûr, n'utilisez pas un point du tout, mais mettez-le tout en œuvre vous-même.


S'il vous plaît laissez dehors le setter. Un type de référence mutable est si effrayant.


@Codeinchanos: une structure mutable struct est effrayante (et à mon avis dans la plupart des cas une mauvaise conception). Un type de référence mutable, en revanche, est correct. L'exemple peut être votre emplacement ou la position de la souris .


@Codesinchaos - S'il n'était pas mutable, il serait inutile de le faire un type de référence. La principale raison (seulement?) De faire une enveloppe de référence pour un type de valeur, c'est que vous pouvez transmettre une identité dont le contenu peut être modifié (toutes les autres références reçoivent la valeur modifiée).



10
votes

Quelque chose comme ça? XXX

EDIT: Si vous souhaitez que cela soit converti automatiquement en / de points, implémentez des conversions implicites conformément au dessus. Notez que je n'ai pas testé ceux-ci, mais ils devraient travailler. Plus d'infos ici: http://msdn.microsoft.com/en-us/library /z5z9kes2.aspx


2 commentaires

Oui, sauf que cela devient très fatigant de le faire pour chaque opérateur et conversion et ...


Voir les conversions implicites ajoutées



4
votes

Si vous en avez besoin pour agir comme un type de référence, utilisez le ref Mot-clé. Cela vous permettra de passer par référence. Avec cela, vous obtiendrez tous les avantages de la performance d'être une structure, ainsi que de savoir spécifiquement lorsque vous vous attendez à ce que cela agisse comme une référence. Vous pouvez également utiliser le out mot-clé pour renvoyer un paramètre par référence.

Si vous en avez besoin pour pouvoir représenter NULL, utilisez un Nullable

si vous souhaitez simplement accéder, c'est comme foo.mypoint.x puis déclarez-le comme un champ comme: xxx


1 commentaires

Je suis programmée en C # car il a été créé pour la première fois et je ne savais jamais que vous pourriez le faire (utilisez "REF" avec un type de valeur)! Cependant, cela a ses limites: impossible de stocker cette "référence" comme élément d'une collection.