Domanda

Restituire un nuovo oggetto su operatori sovraccarichi sembra l'unica cosa da fare. Giusto?

  • Se hai una classe (X) che contiene un buffer di grandi dimensioni
  • Parte del buffer contiene contenuti, il resto è gratuito.
  • L'operatore binario + è stato sovraccaricato per unire due oggetti (dello stesso tipo) creando un nuovo oggetto contenente il contenuto aggiunto di entrambi gli operandi.

In altre parole:

z = x + y // z is a new object containing the appended data from x and y. 

Questo è ovviamente buono perché non vogliamo manipolare x o y durante l'operazione. Tuttavia, le specifiche del linguaggio C # 7.2.2 dicono:

Quando un operatore binario è sovraccarico, anche l'operatore di assegnazione corrispondente (se presente) è implicitamente sovraccarico.

ciò significa che:

x += y;  // will create a new x, copy contents of old x merged with y 
         //  and the old x will be garbage collected at some point

Questo è doloroso, perché potrebbe essere molto più veloce semplicemente copiare il contenuto di y nella porzione libera di x. In questo modo non copiamo un oggetto di grandi dimensioni e lasciamo un casino per la simpatica persona del garbage collector.

Mi rendo conto che questo potrebbe essere fatto con un semplice x.Add (y). Sono curioso di sapere se esiste un modo per farlo utilizzando gli operatori. per esempio per capire che siamo dentro l'operatore di assegnazione ed eseguiamo la routine ottimizzata.

È stato utile?

Soluzione

Personalmente mi piace come C # lo abbia implementato.

È più " ovvio " che:

x += y;

e

x = x + y;

Dovrebbe avere lo stesso comportamento. In C #, questo viene applicato. Con sovraccarichi separati, le persone potrebbero abusare dell'operatore e impedire che ciò comporti lo stesso.

La differenza perfetta sarà così minima, e questo faciliterà anche l'implementazione e la manutenzione, quindi preferisco fortemente l'approccio C #.

Altri suggerimenti

Tutti gli operatori binari matematici restituiscono un nuovo oggetto. Per esempio. Non vorrai che 2 + 3 modifichino il valore di Uno di loro su cinque solo perché li stai aggiungendo. In altre parole, la semantica degli operatori in questione è molto chiara e applicata attraverso le specifiche. Se vuoi qualcosa di diverso dovrai fare qualcosa di diverso :). E personalmente mi piace paragonarlo a c ++ dove puoi fare un sovraccarico tale che A = B = C potrebbe comportare la cancellazione di C, B non assegnato e A uguale a qualsiasi valore senza riguardo a C o B

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top