terça-feira, 1 de setembro de 2009

Cadê as sobrecargas no Silverlight?

Mais de um mês inteiro sem nenhuma postagem, estou com um pouco de falta de criatividade. Aliado a isto tive um problema de saúde que me deixou durante uma semana bastante preocupado, mas já me sinto melhor. Andei estudando Silverlight e WPF, inclusive estou participando de um projeto com ambas as tecnologias e posso dizer com certeza que a curva de aprendizado não é tão grande entre as duas. Uma das dificuldades que estou sentindo na programação em Silverlight é a falta de algumas (várias) sobrecargas de métodos. Isso não chega a ser um problema, mas incomoda quando se tenta utilizar um código antigo numa aplicação Silverlight. Vou colocar dois códigos bem simples, que provavelmente você já deva ter usado:
public bool IsConvertible(Type type)
{
    return type.GetInterface("IConvertible") != null;
}
public T ConvertEnum<T>(object src)
{
    Type type = typeof(T);
    return (T)Enum.Parse(type, src.ToString());
}
Pois bem, apesar de bem simples os dois métodos acima não funcionam exatamente como estão. Isso porque exatamente a sobrecarga utilizada não existe em Silverlght. Obviamente que se passarmos outro parâmetro a acessarmos a outra sobrecarga podemos ver que o Silverlight possui apenas uma forma de acesso, conforme abaixo.
public bool IsConvertible(Type type)
{
    return type.GetInterface("IConvertible", false) != null;
}
public T ConvertEnum<T>(object src)
{
    Type type = typeof(T);
    return (T)Enum.Parse(type, src.ToString(), false);
}
A lista de diferenças e bastante grande, inclui também coisas que se costuma usar com muita frequência até em WPF como é o caso do DependencyProperty.Register que também não tem nenhuma sobrecarga no Silverlight. É só com o dia a dia é que notaremos todas essas diferenças. Não pode-se culpar a equipe de deselvolvimento do Silverlight pois afinal de contas a diferença no tamanho do plugin para o framework .NET completo teria que estar em algum lugar. Mágica não existe. Enjoy

segunda-feira, 20 de julho de 2009

Um pouco mais de Silverlight 3

Vou postar aqui só alguns links importantes para quem está vindo do Silverlight 2 para o 3 ou do Beta para o RTM. Link para o quem vai começar com Silverlight: aqui. Tools para o Visual Studio 2008 (SDK): aqui. Toolkit com os novos controles para Visual Studio 2008: aqui. Página com as mudanças efetuadas pelo time da Microsoft: aqui. Listagem das novidades por Tim Heuer: aqui. Página referência com os principais vídeos. aqui. Por enquanto é isso, e esperar o Visual Studio 2010.

quarta-feira, 15 de julho de 2009

C# 4.0: Named and Optional Parameters

Vou falar hoje de novidades Visual Studio 2010/Framework 4.0. Mais especificamente dos parâmetros opcionais, que não existiam em C# até então. Por motivos de facilidade de interoperabilidade foram criadas algumas estruturas para que o C# pudesse trabalhar com construtores e métodos com parâmetros opcionais. Junto a isso já se criou um problema. Se você tivesse um método com vários parâmetros opcionais como faria para informar apenas o último, penúltimo e assim por diante? Nesse momento entram em campo os Named Parameters, que possibilitam que se especifique o qual dos parâmetros que se está passando. Muitos vão lembrar dos NamedParameters usados em atributos, mas temos que ter em mente que aqui estamos usando-os diretamente em métodos e construtores e definindo valores default. Não são os mesmo utilizados nos atributos e não devem ser confundidos. Bom, abaixo segue um trecho de código onde tenho meu construtor com parâmetros opcionais, todos eles com seus valores default:
class Person
{
    public Person(
        string firstName = "Noname",
        string lastName = "Nolastname",
        DateTime birthDate = new DateTime())
    {
        //Implementação...
    }
}
E aqui eu crio uma instância desta classe passando apenas o segundo parâmetro:
var person = new Person(lastName: "Canova");
Como pode ser visto, utilizo o nome da propriedade e após os ":" eu coloco o valor que quero. As outras propriedades assumirão os valores default. Claro que aqueles que quiserem consumir classes com esta funcionalidade mas que prefiram continuar passando todos os parâmetros, podem fazer como sempre fizeram, lembrando que só é preciso especificar nomes de parâmetros quando não se usa a ordem normal dos mesmos:
var person2 = new Person("Vitor", "Canova");
var person3 = new Person("Vitor", birthDate: new DateTime(1981, 3, 19));
Mas aqui fica uma observação: Use com sabedoria.