Sobrecarga de operadores aritméticos
Defina +, - e * para seus próprios tipos.
Sobrecarga de operadores aritméticos é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
Por que sobrecarregar operadores aritméticos?
A sobrecarga de operadores permite que seus próprios tipos usem símbolos conhecidos, como +, - e *. Para tipos semelhantes a valores, como vetores, dinheiro ou números complexos, isso faz o código parecer matemática em vez de chamadas de métodos.
A sintaxe do operador +
Um operador sobrecarregado é declarado como um método public static cujo nome é operator seguido do símbolo. Pelo menos um parâmetro deve ser do tipo que o contém.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var sum = new Vector2(1, 2) + new Vector2(3, 4);
Console.WriteLine(sum);
}
}Subtração e multiplicação
Você pode sobrecarregar vários operadores no mesmo tipo. Aqui, adicionamos subtração e multiplicação por escalar ao nosso vetor.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a, Vector2 b)
=> new Vector2(a.X - b.X, a.Y - b.Y);
public static Vector2 operator *(Vector2 a, int k)
=> new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var v = new Vector2(5, 6) - new Vector2(2, 1);
Console.WriteLine(v);
Console.WriteLine(new Vector2(2, 3) * 4);
}
}Os operadores são sempre estáticos
Os operadores sobrecarregados devem ser static. Eles não atuam sobre um this oculto; em vez disso, os operandos são passados como parâmetros explícitos. O compilador associa o símbolo ao método.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal amount) { Amount = amount; }
public static Money operator +(Money a, Money b)
=> new Money(a.Amount + b.Amount);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var total = new Money(10.5m) + new Money(4.25m);
Console.WriteLine(total);
}
}Operadores unários
Operadores unários, como a negação, recebem um único operando. Sobrecarregue operator - com um parâmetro para permitir expressões como -v.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a)
=> new Vector2(-a.X, -a.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
Console.WriteLine(-new Vector2(3, -7));
}
}Operandos de tipos mistos
Um operando pode ser de um tipo diferente. Fornecer as duas ordens permite que os usuários escrevam a expressão naturalmente de qualquer uma das formas.
using System;
public struct Temperature
{
public double Celsius;
public Temperature(double c) { Celsius = c; }
public static Temperature operator +(Temperature t, double delta)
=> new Temperature(t.Celsius + delta);
public static Temperature operator +(double delta, Temperature t)
=> new Temperature(t.Celsius + delta);
public override string ToString() => Celsius + "C";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Temperature(20) + 5);
Console.WriteLine(5 + new Temperature(20));
}
}Retornando novos valores
Os operadores aritméticos não devem modificar seus operandos. Eles calculam e retornam um valor novo, mantendo os valores originais inalterados, assim como int faz.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var a = new Vector2(1, 1);
var b = new Vector2(2, 2);
var c = a + b;
Console.WriteLine("a unchanged: " + a);
Console.WriteLine("result: " + c);
}
}Encadeando operações aritméticas
Como cada operador retorna o mesmo tipo, as expressões podem ser encadeadas naturalmente e respeitam a precedência e a associatividade normais.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b) => new Vector2(a.X + b.X, a.Y + b.Y);
public static Vector2 operator *(Vector2 a, int k) => new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var result = new Vector2(1, 1) + new Vector2(2, 2) * 3;
Console.WriteLine(result);
}
}Operadores em classes
A sobrecarga de operadores também funciona em classes, não apenas em estruturas. Tenha cuidado com null: um operando de classe pode ser nulo, portanto proteja-o se necessário.
using System;
public class Complex
{
public double Re, Im;
public Complex(double re, double im) { Re = re; Im = im; }
public static Complex operator +(Complex a, Complex b)
=> new Complex(a.Re + b.Re, a.Im + b.Im);
public override string ToString() => Re + " + " + Im + "i";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Complex(1, 2) + new Complex(3, 4));
}
}Um tipo numérico completo
Aqui está um pequeno tipo de fração com adição. Ele mostra como a sobrecarga transforma um tipo de domínio em algo que se comporta como um número integrado.
using System;
public struct Fraction
{
public int Num, Den;
public Fraction(int num, int den) { Num = num; Den = den; }
public static Fraction operator +(Fraction a, Fraction b)
=> new Fraction(a.Num * b.Den + b.Num * a.Den, a.Den * b.Den);
public override string ToString() => Num + "/" + Den;
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Fraction(1, 2) + new Fraction(1, 3));
}
}Experimente por si mesmo
Adicione a uma estrutura semelhante a dinheiro operações de adição e multiplicação por escalar; depois, crie uma expressão que pareça uma operação aritmética comum.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal a) { Amount = a; }
public static Money operator +(Money a, Money b) => new Money(a.Amount + b.Amount);
public static Money operator *(Money a, int qty) => new Money(a.Amount * qty);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var price = new Money(4.50m);
var total = price * 3 + new Money(2.00m);
Console.WriteLine(total);
}
}Verificação rápida
Relembre a assinatura de um operador sobrecarregado.
Recapitulação
A sobrecarga de operadores aritméticos faz com que tipos semelhantes a valores pareçam matemática.
- Declare-os como
public staticusando a palavra-chaveoperator. - Pelo menos um parâmetro deve ser do tipo que os contém.
- Retorne um valor novo; nunca modifique os operandos.
- Forneça as duas ordens de operandos para operações aritméticas de tipos mistos.
Perguntas Frequentes
A aula “Sobrecarga de operadores aritméticos” é grátis?
Sim — o texto completo de “Sobrecarga de operadores aritméticos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Sobrecarga de operadores aritméticos”?
Defina +, - e * para seus próprios tipos. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Sobrecarga de operadores aritméticos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Sobrecarga de operadores aritméticos
- Sobrecarga de operadores de comparação
- Conversões definidas pelo usuário
- Boas práticas para sobrecarga de operadores