C# opérateur de surcharge pour `+=`?
Je suis en train de faire la surcharge de l'opérateur pour +=
, mais je ne peux pas. Je ne peux que faire un opérateur de surcharge pour +
.
Comment venir?
Modifier
La raison pour laquelle cela ne fonctionne pas, c'est que j'ai un Vecteur de classe (avec X et Y du champ). Considérons l'exemple suivant.
vector1 += vector2;
Si mon opérateur de surcharge est fixé à:
public static Vector operator +(Vector left, Vector right)
{
return new Vector(right.x + left.x, right.y + left.y);
}
Alors le résultat ne sera pas ajouté à vector1, mais au lieu de cela, vector1 va devenir une marque nouveau Vecteur par une référence.
- Ressemble à une longue discussion a déjà eu à ce sujet: maurits.wordpress.com/2006/11/27/...
- Pouvez-vous expliquer pourquoi vous essayez de faire cela? Vous obtenez une surcharge "+=" opérateur de gratuitement quand vous surchargez "+". Est-il une situation dans laquelle vous voulez "+=" à être surchargé, mais ne veulent pas "+" pour être surchargé?
- À venir à partir de C++, il se sent juste mal, mais en C# c'est en fait tout à fait logique.
- double possible de Pourquoi ne puis-je pas la surcharge de l'opérateur += en C#? Mais je ne peux toujours l'utiliser?
- J'ai ajouté une explication de pourquoi j'ai besoin de cette.
- re mise à jour: Vecteurs devrait se comporter comme immuable des objets mathématiques. Lorsque vous ajoutez 2 à 3, vous n'avez pas la mutation de l'objet 3 dans l'objet 5. Vous créez un nouvel objet, 5. Le point de surcharge outre, les opérateurs est de faire vos propres objets mathématiques; en faire mutable fonctionne à l'encontre de cet objectif. Je voudrais rendre votre type de vecteur est immuable type de valeur.
- Si
SomeEvent
est un événement,SomeEvent += SomeDelegate
a une signification très différente deSomeEvent = SomeEvent + SomeDelegate
. De plus, même siVector
étaient externe immuable type, ayantvec1 += vec2;
traduire commeVector.AddTo(ref Vector dest, Vector src);
pourrait offrir la même sémantiquedest = dest + src;
mais sans structure redondante-les opérations de copie.
Vous devez vous connecter pour publier un commentaire.
Overloadable Opérateurs, à partir de MSDN:
Même plus, aucun des opérateurs d'affectation peut être surchargée. Je pense que c'est parce qu'il y aura un effet pour la collecte des Ordures et la gestion de la mémoire, qui est potentiellement un trou de sécurité dans le CLR forte tapé monde.
Néanmoins, nous allons voir ce qu'est exactement un opérateur. Selon le célèbre Jeffrey Richter livre, chaque langage de programmation a sa propre liste des opérateurs, qui sont compilées dans un rapport spécial des appels de méthode, et CLR lui-même ne sait rien sur les opérateurs. Donc, nous allons voir exactement ce que les séjours derrière les
+
et+=
opérateurs.Voir ce simple code:
Laisser afficher l'IL-code pour ce mode:
Voyons maintenant ce code:
Et IL-code:
Ils sont égaux! Ainsi, le
+=
opérateur est juste sucre syntaxique pour votre programme en C#, et vous pouvez simplement de surcharge+
opérateur.Par exemple:
Ce code sera compilé et exécuté avec succès comme:
Mise à jour:
En fonction de votre mise à Jour - comme l' @EricLippert dit, vous devriez vraiment avoir les vecteurs comme un objet immuable. Résultat de la somme de deux vecteurs est un nouveau vecteur, pas le premier avec des tailles différentes.
Si, pour une raison quelconque vous avez besoin de changer de premier vecteur, vous pouvez utiliser cette surcharge (mais comme pour moi, c'est très étrange comportement):
v3 = v1 + v2;
résultat dansv1
être changé ainsi quev3
est inhabituelJe pense que vous trouverez ce lien instructif: Overloadable Opérateurs
C'est à cause de la même raison que l'opérateur d'affectation ne peut pas être surchargé. Vous ne pouvez pas écrire du code qui permettrait d'effectuer l'affectation correctement.
De MSDN.
Vous ne pouvez pas surcharger
+=
parce qu'il n'est pas vraiment un opérateur unique, c'est juste sucre syntaxique.x += y
est juste une abréviation de l'écriturex = x + y
. Parce que+=
est définie en termes de+
et=
opérateurs, vous permettant de remplacer séparément pourrait créer des problèmes, dans les cas oùx += y
etx = x + y
ne se comportent pas exactement de la même façon.À un niveau inférieur, il est très probable que le compilateur C# compile les deux expressions au même bytecode, ce qui signifie qu'il est très probable que l'exécution ne peut pas traiter différemment pendant l'exécution du programme.
Je comprends que vous ayez envie de le traiter comme une opération distincte: dans un énoncé comme
x += 10
vous savez que vous pouvez muter lex
objet en place et peut-être gagner du temps/de la mémoire, plutôt que de créer un nouvel objetx + 10
avant de l'affecter sur l'ancienne référence.Mais considérer ce code:
Devrait
a == b
à la fin? Pour la plupart des types, non,a
est 10 de plus queb
. Mais si vous pouviez surcharge de la+=
opérateur muer en place, alors oui. Maintenant, considérons quea
etb
pourrait se passer autour de différentes parties du programme. Votre optimisation possible pourrait créer de la confusion des bugs si votre objet commence à changer, là où le code ne vous attendez pas à.En d'autres termes, si la performance est si important que cela, il n'est pas trop dur à remplacer
x += 10
avec un appel de méthode commex.increaseBy(10)
, et c'est beaucoup plus clair pour tout le monde.it's just syntactic sugar
àit's just syntactic sugar in C#
; sinon, il semble trop général, mais dans certains langages de programmation, il n'est pas juste sucre syntaxique, mais pourrait en fait donner des avantages de performance.+=
pourrait probablement être optimisé par un smart compilateur, parce que l'arithmétique est simple. Mais une fois que vous avez affaire à des objets, tous les paris sont éteints. Toute langue visages peu près les mêmes problèmes. C'est pourquoi la surcharge d'opérateur est le mal.C'est à cause de cet opérateur ne peut pas être surchargé:
MSDN
Juste surcharge
+
opérateur, en raison dex += y
égal àx = x + y
Opérateur de surcharge pour
+
est utilisé dans+=
opérateur,A += B
est égal àA = operator+(A, B)
.Si vous surchargez
+
opérateur comme ceci:vous pouvez faire
ou
Cela permettra de compiler et d'exécuter de manière égale.
Il y a toujours la même réponse à ce problème: Pourquoi avez-vous besoin
+=
, si vous obtenez gratuitement si vous surchargez la+
. Mais qu'advient-il si j'ai une classe de ce genre.Avez-vous encore dire qu'il est bon que le
+=
est "auto-mise en œuvre". Si vous essayez de faire le calcul de haute performance en C# vous avez besoin de ces fonctionnalités pour réduire les temps de traitement et la consommation de mémoire, si quelqu'un a une bonne solution, il est très apprécié, mais ne me dites pas que je dois le faire avec des méthodes statiques, ce n'est qu'une solution de contournement et je ne vois pas pourquoi C# ne le+=
mise en œuvre si elle n'est pas définie, et si elle est définie, il sera utilisé. Certaines personnes disent que ne pas avoir de différence entre+
et+=
permet d'éviter des erreurs, mais ce n'est pas mon problème?+=
est votre problème... c'est vrai que si personne d'autre ne l'a jamais de lire, de maintenir, ou de l'exécution de votre code.List<T>
l'aide d'un opérateur commelist += "new item"
, par exemple. Vous appelez saAdd
méthode à la place.J'ai eu exactement la même question et je ne peut pas répondre mieux, puis cette personne a
Une meilleure méthode de conception est une conversion Explicite. Vous pouvez certainement la surcharge de Casting.