pontoNETpt
A comunidade PontoNetPT está direccionada a todos os programadores que trabalhem com a plataforma .NET.
Métodos anônimos... quem?

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
Filed under:

Add a Comment

(requerido)  
(opcional)
(requerido)  
Remember Me?
If you can't read this number refresh your screen
Enter the numbers above:  
Powered by Community Server (Commercial Edition), by Telligent Systems