C# - Sobrecarga de operadores - III


Hoje vamos recordar o conceito de sobrecarga de operadores na linguagem C#.

Continuando o assunto Sobrecarga de operadores veremos agora a sobrecarga de operadores de comparação (==, !=, <, >, <=, >= ). Esses são os operadores binários que podemos sobrecarregar na linguagem C#.


 

Sobrecarga de Operador de Comparação

O operador de comparação opera em dois operandos e retorna o valor booleano quando compara o valor do lado esquerdo do operando com o valor do operando do lado direito.

Os operadores de comparação, bem como verdadeiro e falso, devem ser sobrecarregado em pares. Por exemplo, ao sobrecarregar o operador igual(=) significa que o operador não igual (!=) também precisa ser sobrecarregado.

Sintaxe:

public static bool operator op (Type1 t1,  Type2 t2)
{
       // TODO:
}

Exemplo 1 : Sobrecarga dos operadores > e <

Neste exemplo temos a sobrecarga do operador de comparação < e também do operador >

    public class Distancia
    {
        public double metros { get; set; }

        public static bool operator <(Distancia d1, Distancia d2)
        {
            return (d1.metros < d2.metros);
        }
        public static bool operator >(Distancia d1, Distancia d2)
        {
            return (d1.metros > d2.metros);
        }
    }

Observe que temos que fazer a sobrecarga dos operadores > e <.

No código abaixo usamos o namespace :

using static System.Console;

    class Program
    {
        static void Main(string[] args)
        {
            Distancia d1 = new Distancia { metros = 149.600 };
            Distancia d2 = new Distancia { metros = 227.940 };
            if (d1 < d2)
            {
                WriteLine($"{d1.metros} é menor que {d2.metros}");
            }
            else if (d1 > d2)
            {
                WriteLine($"{d2.metros} é menor que {d1.metros}");
            }
        }
    }

Quando este código for executado, será feita a avaliação usandos os operadores sobrecarregados <  e > que retornam true ou false.

Sobrecarga de operadores e herança

Mesmo que os operadores sobrecarregados sejam declarados como estáticos, eles são herdados para as classes derivadas.

Como a declaração do operador sempre requer a classe ou estrutura na qual o operador é declarado, para participar da assinatura do operador, não é possível para um operador declarado em uma classe derivada ocultar um operador declarado em uma classe base.

Assim, o novo modificador new é obrigatório e nunca é permitido em uma declaração de operador.

Sobrecarga de operadores: restrições

Existem ainda as seguintes restrições na sobrecarga de operadores.

Você não pode Criar um novo operador;
• Não pode Alterar a sintaxe de um operador;
• Não pode Redefinir como um operador trabalha nos tipos predefinidos;
• Não pode Alterar a precedência ou associatividade de um operador;

Sobrecarga de operadores : cuidados

Se o seu objeto operando for um objeto de tipo de valor, a sobrecarga deve funcionar bem. Mas você precisa ser um pouco cuidadoso quando seu tipo definido pelo usuário for um tipo de referência.

Para um objeto de tipo de referência, as pré-operações devem funcionar bem porque não são feitas cópias. Mas para as pós-operações, a cópia salva é uma cópia da referência, isso significa que tanto a cópia original como a de referência estão apontando para o mesmo objeto.

Então, quando a segunda etapa for executada, o código de incremento ou decremento é executado naquele objeto. Isso significa que a referência salva aponta para um objeto não está mais em seu estado original e isso pode levar a resultados inesperados.

Pegue o código do projeto aqui:  SobrecargaOperadorComparacao.txt

(disse Jesus)"Aquele que tem os meus mandamentos e os guarda esse é o que me ama; e aquele que me ama será amado de meu Pai, e eu o amarei, e me manifestarei a ele."
João 14:21

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti