Tipo Unit

Para simplificar o trabalho com operações aritméticas sobre valores como percentagens e valores absolutos, pode usar o tipo de dados Unit. Permite operações transparentes de adição, subtração, multiplicação e divisão. Unit pode ser convertido para Decimal (exceto quando o valor é uma percentagem, isto é, quando o tipo Unit.Type está definido como UnitTypes.Percent) e de volta (neste caso, é sempre criado um valor com valor absoluto, isto é, o tipo Unit.Type fica definido como UnitTypes.Absolute).

Usar Unit

  • Pode criar um Unit usando construtores especiais ou usar uma notação mais curta com a ajuda de UnitHelper:

    // criar um valor absoluto
    var absolute = new Unit(30);
    
    // criar um valor percentual
    var percent = 30.0.Percents();
    
  • Unit tem saída formatada. Portanto, a conversão de valores para uma string depende do tipo UnitTypes:

    Console.WriteLine("absolute = " + absolute);
    Console.WriteLine("percent = " + percent);
    

    produzirá as seguintes linhas:

    absolute = 30
    percent = 30%
    
  • As operações aritméticas sobre Unit são executadas da mesma forma que sobre números normais:

    // adição de valores
    Console.WriteLine("absolute + percent = " + (absolute + percent));
    
    // multiplicação de valores
    Console.WriteLine("absolute * percent = " + (absolute * percent));
    
    // subtração de valores
    Console.WriteLine("absolute - percent = " + (absolute - percent));
    
    // divisão de valores
    Console.WriteLine("absolute / percent = " + (absolute / percent));
    
  • O resultado das operações aritméticas sobre Unit torna-se ele próprio um Unit, cujo tipo é igual ao tipo do primeiro operando. Por exemplo, se adicionar um valor absoluto e uma percentagem, o resultado estará num valor absoluto:

    // adição de valor absoluto e percentagem
    var resultAbsolutePercents = absolute + percent;
    // e conversão de valor absoluto para decimal
    var resultAbsolutePercentsDecimal = (decimal)resultAbsolutePercents;
    Console.WriteLine("absolute + percent = " + resultAbsolutePercents);
    Console.WriteLine("(decimal)(absolute + percent) = " + resultAbsolutePercentsDecimal);
    

    A saída dessas operações será a seguinte:

    absolute + percent = 39
    (decimal)(absolute + percent) = 39
    
  • Também pode usar operadores de comparação familiares para comparar valores:

    if (absolute > percent)
        Console.WriteLine("O valor absoluto é maior que o percentual");
    
    if (absolute == percent)
        Console.WriteLine("Os valores são iguais");
    
  • Para tornar um valor positivo, pode usar o método Abs():

    var negative = new Unit(-10);
    var positive = negative.Abs(); // 10
    
  • Para multiplicar um valor por um fator específico, pode usar o método Times():

    var multiplied = absolute.Times(5); // 150
    

Limitações

  • Valores do tipo UnitTypes.Percent não podem ser convertidos para outros tipos
  • Valores do tipo UnitTypes.Limit não podem ser usados em operações aritméticas
  • A comparação entre valores de tipos diferentes nem sempre é possível

O tipo Unit fornece uma forma consistente de trabalhar com vários tipos de valores em aplicações de negociação, facilitando a expressão de cálculos relacionados com preço e volume.