Um artigo anterior, publicado neste blog, foi dedicado a Lambda Expressions, explicando de um modo geral o seu funcionamento e o seu sintaxe.
Com a chegada do Visual Studio 2010, algumas das limitações que existiam e que já estavam disponível no C# 3.0, foram introduzidas, já sendo agora possível criar expressões em múltiplas linhas e expressões que não retornam resultados.
Podemos então criar lambda expressions em uma linha ou em várias linhas:
' Função single-line
Dim result1 = Function(x) x * x
' Função multi-line
Dim result2 = Function(x)
Return (x * x)
End Function
' Mostra os resultados
Debug.WriteLine(result1(5))
Debug.WriteLine(result2(5))
E podemos também criar lambda expressions que não retornam resultados, substituindo a keyword Function() por Sub():
' Subrotina single-line
Dim showResult1 = Sub(result As Integer) Debug.WriteLine(result.ToString())
' Subrotina multi-line
Dim showResult2 = Sub(result As Integer)
Debug.WriteLine(result.ToString())
End Sub
' Mostrando os resultados
showResult1(12345)
showResult2(12345)
Mais alguns exemplos, um pouco mais complexos, de como podemos criar expressões em várias linhas, com diferentes validações e retornando ou não resultados:
Dim listValues As New List(Of Integer) From
{1, 2, 3, 4, 5, 6, 7, 8}
' Irá mostrar os resultados com diferentes outputs para
' os números superiores, inferiores e iguais a 5
Array.ForEach(listValues.ToArray,
Sub(x)
If x > 5 Then
Debug.WriteLine(x.ToString & " é maior que 5")
ElseIf x = 5 Then
Debug.WriteLine(x.ToString & " é o número certo")
Else
Debug.WriteLine(x.ToString & " é menor que 5")
End If
End Sub)
' Irá mostrar os resultados e irá colocar na variável 'result', todos os
' números superiores a 5, ou seja, criará um array com os número 6, 7 e 8
Dim result = Array.FindAll(listValues.ToArray,
Function(x)
Debug.WriteLine(x)
Return x > 5
End Function)
Mais algumas melhorias que vêm ajudar a tornar as lambda expressions mais versáteis e com cada vez com mais aplicação!
Collection Initializers é um método simples de adicionar alguns dados a uma colecção, usando a keyword From, seguida de chavetas curvas { }. Esta opção é útil quando alguns dados de uma colecção são sempre os mesmos ou quando existem algumas constantes na colecção.
Por exemplo, para se criar um array simples com alguns dados em Visual Studio 2010:
Dim numbers = {1, 2, 3, 4, 5}
Dim sexo = {"masculino", "feminino"}
Estes são exemplos simples, que também poderiam ser criados em versões anteriores, como VS2005 ou VS2008, embora com um sintaxe um pouco diferente, indicando que se tratavam de arrays:
' Exemplo em Visual Studio 2008
Dim numbers() = {1, 2, 3, 4, 5}
Dim sexo() = {"masculino", "feminino"}
Mas vejamos o caso de colecções, neste caso uma List(Of T):
Dim listaSexos As New List(Of String) From {"Masculino", "Feminino"}
Em versões anteriores poderia ser feito da seguinte forma:
' Exemplo em Visual Studio 2008
Dim listaSexos As New List(Of String)
listaSexos.Add("Masculino")
listaSexos.Add("Feminino")
' ou, como se trata de strings, usando um array
listaSexos.AddRange(New String() {"Masculino", "Feminino"})
Podemos também usar os collection Initializers com classes, neste caso, com uma classe simples de estudantes:
Public Class Student
Public Property Name As String
Public Property Age As Int16
Sub New(ByVal _Name As String, ByVal _Age As Int16)
Name = _Name
Age = _Age
End Sub
End Class
Depois, criando uma nova instancia e indicando alguns dados:
Dim students = New List(Of Student) From
{
New Student("Jorge", 35),
New Student("Ana", 30),
New Student("Paula", 25)
}
Em suma, os collection Initializers são métodos simples de se inicializar colecções que visam, uma vez mais, simplificar o código!
Quando uma linha de código é demasiado extensa, é necessário muitas vezes saltar de linha, de modo a que o código fique todo visível e seja mais simples de interpretar. Para o fazer é usado um “_” (underscore):
MessageBox.Show("Isto é um teste", _
My.Application.Info.Title, _
MessageBoxButtons.OK, _
MessageBoxIcon.Warning)
Ora isto é algo que no Visual Studio 2010 deixou de ser necessário, podendo agora ser utilizado:
MessageBox.Show("Isto é um teste",
My.Application.Info.Title,
MessageBoxButtons.OK,
MessageBoxIcon.Warning)
Obviamente que isto não pode ser efectuado em todas as situações, pois o compilador precisa de saber identificar se estamos a saltar de linha ou a iniciar uma nova instrução.
Estas são algumas das situações onde é possível o fazer:
- Após uma virgula “,”
- Após um parêntese aberto “(“ ou antes de um fechado “)”
- Após uma chaveta recta “{“ ou antes de uma chaveta recta “}”
- Após uma concatenação “&”
- Após uma atribuição “=, &=, :=, +=, -=, *=, /=, \=, ^=, <<=, >>=”
- Após um operador binário “+, -, /, *, Mod, <>, <, >, <=, >=, ^, >>, <<, And, AndAlso, Or, OrElse, Like, Xor”
- Após um operador Is ou IsNot
Entre muitas outras situações, como LINQ, XML Literals, etc.
Mais uma melhoria com o objectivo de simplificar a vida ao programador!