Back-End

14 set, 2017

C# 7.0: Throw Expressions

Publicidade

Desde os primórdios do C# a utilização da palavra-chave throw esteve restrita a instruções voltadas à geração de exceções. A utilização deste recurso em uma expressão (instrução que retorna algum valor) não era possível de forma direta, o que forçava o uso de estruturas condicionais como ifs.

Tal situação pode ser observada na implementação da classe Temperatura:

using System;
 
namespace ThrowExpressions
{
 public class Temperatura
 {
 private double _celsius;
 
 public double Celsius
 {
 get
 {
 return _celsius;
 }
 set
 {
 if (value >= -273.15)
 _celsius = value;
 else
 throw new Exception("Temperatura inválida!");
 }
 }
 
 public double Fahrenheit
 {
 get => ((9.0 / 5.0) * _celsius) + 32;
 }
 }
}

O C# 7.0 conta agora com as Throw Expressions, um tipo de funcionalidade que permite lançar exceções a partir do próprio código que define uma expressão. O próximo exemplo é uma versão refatorada da classe Temperatura, com a propriedade Celsius empregando este novo recurso:

using System;
 
namespace ThrowExpressions
{
 public class Temperatura
 {
 private double _celsius;
 
 public double Celsius
 {
 get
 {
 return _celsius;
 }
 set
 {
 _celsius = value >= -273.15 ? value : throw new Exception("Temperatura inválida!");
 }
 }
 
 public double Fahrenheit
 {
 get => ((9.0 / 5.0) * _celsius) + 32;
 }
 }
}

Este recurso pode ainda ser combinado aos novos Expression-bodied Members da linguagem, produzindo assim um resultado mais enxuto:

using System;
 
namespace ThrowExpressions
{
 public class Temperatura
 {
 private double _celsius;
 
 public double Celsius
 {
 get => _celsius;
 set => _celsius = value >= -273.15 ? value : throw new Exception("Temperatura inválida!");
 }
 
 public double Fahrenheit
 {
 get => ((9.0 / 5.0) * _celsius) + 32;
 }
 }
}

Ao tentar associar um valor inválido à propriedade Celsius:

using System;
 
namespace ThrowExpressions
{
 class Program
 {
 static void Main(string[] args)
 {
 Temperatura t = new Temperatura();
 t.Celsius = -300;
 
 Console.ReadKey();
 }
 }
}

Acontecerá então o seguinte erro em tempo de execução:

Throw Expressions

Referências