Pergunta

Voltando um novo objeto de operadores sobrecarregados parece ser a única coisa a fazer. Certo?

  • Se você tem uma classe (X) que contém um grande buffer
  • Parte do buffer contém conteúdo, o descanso é livre.
  • ter sobrecarregado o operador + binário para fundir dois objectos (do mesmo tipo) com a criação de um novo objecto que contém os conteúdos de ambos os operandos anexas.

Em outras palavras:

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

Esta é obviamente bom porque nós não queremos mangle x ou y durante a operação. No entanto, C # linguagem especificações 7.2.2 digamos:

Quando um operador binário está sobrecarregado, o operador de atribuição correspondente (se houver) é também sobrecarregada implicitamente.

Isto significa que:

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

Esta é doloroso, porque ele pode ser muito mais rápido para apenas copiar o conteúdo de y na porção livre de x. Dessa forma, não copie um objeto grande e deixar uma bagunça para a pessoa agradável coletor de lixo.

Eu percebo que isso poderia ser feito com um simples x.Add (y). Estou curioso para saber se há uma maneira de fazê-lo usando operadores. por exemplo, para descobrir o que está dentro do operador de atribuição e executar a rotina otimizada.

Foi útil?

Solução

Eu, pessoalmente, gosto de como C # implementado este.

É mais "óbvio" que:

x += y;

e

x = x + y;

deve ter o mesmo comportamento. Em C #, esta é aplicada. Com sobrecargas separadas, as pessoas poderiam abusar do operador e evitar que isso agindo da mesma.

A diferença perf será tão mínima, e isso também faz com que seja mais fácil de implementar e manter, por isso prefiro fortemente a abordagem C #.

Outras dicas

Todos os operadores binários matemáticas retorna um novo objeto. Por exemplo. Você não gostaria que 2 + 3 para alterar o valor de um deles a cinco só porque você estava adicionando-os. Em outras palavras a semântica dos operadores em questão é muito clara e executada através das especificações. Se você quiser algo diferente, você terá que fazer algo diferente :). E eu pessoalmente como se comparar com c ++ onde você pode fazer a sobrecarga tal a A = B = C pode resultar em C sendo excluído, B sendo unassigned e A igualando qualquer valor sem que diz respeito à C ou B

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top