Olá pessoal, já ouviram falar de Syntactic Sugar ?
Syntactic Sugar, também usado como Syntax Sugar, é um termo utilizado para quando uma linguagem de programação oferece uma forma mais fácil de ser lida e escrita.
Usar syntactic sugar refere-se a escrever um código de forma alternativa ao modo tradicional, com a finalidade de escrever menos código e torná-lo mais expressivo.
O que acontece é que nem sempre conhecemos todos os modos de se escrever em uma linguagem e podemos nos deparar com um código “estranho”.
Vou abordar dois exemplos de Syntactic Sugar em C#.
Primeiro exemplo:
O que está acontecendo aqui?
int? numero = null; numero = 12;
Colocar um “?” no final de um tipo significa dizer que ele é um “Nullable Type”.
Nullable Type são instâncias de System.Nullable<T> struct. Ou seja, um int por exemplo pode receber valores entre -2147483648 a 2147483647 mas nunca um “null”, um int? além de receber valores entre -2147483648 a 2147483647 também pode receber “null”.
Em algum determinado momento sua variável do tipo int poderia receber um dado nulo “null”, por exemplo, ao receber valores de uma tabela de um banco de dados onde a coluna estivesse vazia “null”.
Se você fizer isso terá um erro:
int numero = null; numero = 12; //Cannot convert null to 'int' because it is a non-nullable value type
Usar “?” para descrever um “Nullable Type” é uma forma reduzida, pois originalmente é feito assim:
System.Nullable<int> numero = null; numero = 12;
Legal, agora já aprendemos o que é um “Nullable Type” e como declarar um tipo desse de forma reduzida.
Segundo exemplo:
O que está acontecendo aqui?
string NomePrincipal = null; string NomeAlternativo = "Eduardo"; string Nome = NomePrincipal ?? NomeAlternativo;
Afinal o que são estes dois pontos de interrogação? (??)
O código acima é para testar se a variável NomePrincipal não é nula (null) e se caso for, então atribuir a variável NomeAlternativo para a variável Nome.
Este é mais um exemplo de syntactic sugar no C#, menos código escrito e mais simples de entender. O que está acontecendo no código acima poderia ser escrito assim:
string NomePrincipal = null; string NomeAlternativo = "Eduardo"; string Nome = NomePrincipal != null ? NomePrincipal : NomeAlternativo;
Agora deu para entender?
No exemplo acima utilizamos um operador ternário. O operador ternário já é uma forma de escrever menos código, porém não é syntactic sugar.
Note que o primeiro exemplo de código exibido não é um operador ternário, apenas foi escrito de uma forma “abreviada” (isto é syntactic sugar).
string Nome = NomePrincipal ?? NomeAlternativo;
Note também que usar o “??” é valido apenas para testar se um valor é “null”, não pode ser aplicado para outros tipos de validações.
Veja como ficaria se estivéssemos escrevendo da forma mais básica:
string NomePrincipal = null; string NomeAlternativo = "Eduardo"; string Nome; if (NomePrincipal != null) { Nome = NomePrincipal; } else { Nome = NomeAlternativo; }
Muito mais código, maior o tempo para ler e compreender.
Vamos aumentar as possibilidades? Veja só:
string NomePrincipal = null; string NomeAlternativo = null; string NomeQualquer = null; string Nome = NomePrincipal ?? NomeAlternativo ?? NomeQualquer ?? "Sem Nome"; // Resultado: Nome = "Sem Nome"
Podemos usar quantos “??” quisermos em nosso código, experimente escrever isso da forma mais básica, seria chato né? 🙂
Usar os benefícios do syntactic sugar é legal, facilita nosso entendimento ao ler e agiliza na hora de escrever reduzindo o tempo de codificação.
Referências:
Se você gostou compartilhe esse artigo, se tiver dúvidas ou quiser contribuir com algo faça um comentário.
Até a próxima.
Perfeito! Vai me ajudar muito! kk, tenho vários :
if (NomePrincipal != null)
{
Nome = NomePrincipal;
}
else
{
Nome = NomeAlternativo;
}
rsrsrs
Nossa!! Bom demais
Uma pena que só vi isso agora!!
Mto obrigado Daniel!
?? == COALESCE
Excelente post, a linguagem disponibiliza vários recursos a fim de facilitar o trabalho dos programadores, cabe aos profissionais ler as documentações, e posts como este, que ajudam na evolução profissional.
Parabéns pelo post Eduardo Pires.
Boa dica, Valeu
Que 10!
Parabéns, Eduardo…
Obrigado pela dica!
amigo, bom dia!
estou em face de aprendizagem e ja converti um projeto que tenho em vb6.
Foi no inicio dificil mas superei. Agora que ele está pronto ne deparo com outro bug. Cionfesso que vivo desemprego a anos, e somente serviços braçais estão me sufocando. Resolvi voltar a antiga profissão de programador que iniciei em 1992. (basic,cobol.mumps, clipper5) foram as experiências em algumas empresas. O vb6 foi um aprendizado recente de uns 5 anos para ca. E somente como atividade ocupacional terapeutica. Assim como estou agora com o c#.
O que tenho neste projeto é algo simples mas util ao meu dia a dia. Construi uma agenda eletronica que apresenta uma folha de calendario, ali voce clica na data e abre uma pagina de memorando. Tambem neste
utilitário temos um cadastro de agenda telefonica, e um cadastro para despertador de compromissos. Na parte visual deste calendário os dias que foram criados memorandos apresentam se com amarelo os numeros. Nos dias que alem do memorando digitado forem ativados algum horario para o despertador, apresenta-se em cor vermelha.
Ok, na barra superior da tela existe o relogio digital sempre ativo nesta agenda, que percorre qualquer data anual. O que está com o bug, e o componente timer no evento tick(). Ele o evento tick, quando inicia apresenta por meio do DateTime.Now() a hora do sistema. ok
A curiosidade que me intriga é o fato que na barra do windows por exemplo está indicando 09:49, o meu executavel no label do relógio joga por meio do DateTime.now() a hora com atraso de 20 minutos.
Além disto o que apresenta no label é sempre a mesma hora e minutos,
somkente observamos os segundos mudarem, de 0 a 60. e novamente zerando não atualiza os minutos. Fica sempre patinado nesta hora que deu entrada (09:31)
Já entrtei no forum e estou fazendo corretamente as expresso~es de sintaxe:
private void FrmMenu_Load(object sender, EventArgs e)
{
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = (1000) * (1);
timer1.Enabled = true;
timer1.Start();
}
//————————————————-
private void timer1_Tick(object sender, EventArgs e)
{
label2.Text = DateTime.Now.ToString(“HH:MM:ss”);
}
No vb6 ele funciona excelente, gerando leitura no arquivo de horarios e despertando corretamente, como o label sempre apresentando a hora, minutos corretamente.
Estou entrando no seu site tentando ouvir alguem. Moro em area rural e longe de outros programadores que popssam trocar experiência.
Agradeço por alguma luz de idéia.
Fabiano ->
felicidades!