Quando conheci a nova funcionalidade do C# 2.0 chamada de anonymous method (método anônimo) pensei que fosse um recurso que não seria de grande utilidade. Porém, quando comecei a trabalhar com o generics, também do C# 2.0, comecei a dar uma atenção diferenciada a esta nova funcionalidade. Porque? Vamos lá...
Quando trabalhamos com o Generics temos a possibilidade de criar delegates e utilizá-los. Porém, nem sempre é relevante criarmos um método somente para atender um determinado requisito. Abaixo mostro um exemplo, onde utilizamos o objeto List e necessitamos efetuar um “find”. Como o List é um objeto do generics, ele não implementa o método, apenas aponta para um delegate. Veja o código abaixo:
public delegate bool Predicate(T obj);
public T Find(Predicate<T> match) {
if (match == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
for (int i = 0; i this._size; i++) {
if (match(this._items[i])) {
return this._items[i];
}
}
return default(T);
}
Então temos um delegate, que é o responsável por chamar o método que realizará a comparação do item com algo. Mas, e o método anônimo? Para poder utilizar o Find temos que passar um método como parâmetro, que é o delegate. Mas, em alguns casos este método será especifico para um único método, o que torna dispensável a criação de um método convencional. Assim, vejamos o exemplo abaixo:
public void GetUsers() {
List<string> newUsers = GetIntegrationUsers();
Users users = Users.GetAll();
foreach (string user in users) {
string match = newUsers.Find(delegate(string searchUser) { return searchUser.Equals(user); });
if (match != null) {
newUsers.Remove(match);
}
}
AddNewUsers(newUsers);
}
Neste método, executamos o find passando como parâmetro o usuário existente. Veja que a assinatura do método que realiza a comparação recebe como parâmetro apenas o item atual da coleção, não podendo passar o valor que estamos procurando. Caso fossemos criar um método convencional, teríamos que criar um field na classe, no qual armazenaríamos o valor que estamos procurando para o método poder efetuar o find. Veja um exemplo neste modelo:
private string _user;
public void GetUsers() {
List<string> newUsers = GetIntegrationUsers();
Users users = Users.GetAll();
foreach (string user in users) {
_user = user;
string match = newUsers.Find(Compare);
if (match != null) {
newUsers.Remove(match);
}
}
AddNewUsers(newUsers);
}
private bool Compare(string searchUser) {
return searchUser.Equals(_user);
}
Podemos observar que o código ficou um pouco mais complicado, mas com a mesma funcionalidade. Portanto, fica claro que podemos, e devemos, utilizar os métodos anônimos quando necessário. Isso não quer dizer que sempre devamos utilizar métodos anônimos, pois há situações que os mesmo tornariam o método complexo demais. Vale o bom senso.
Espero que tenha conseguido passar a utilidade que esta funcionalidade do C# 2.0 tem, e como podemos nos usufruir dela. Divirtam-se.
?>
Posted
4-8-2007 5:21
por
Felipe Cavalcante Vilella de Oliveira