quarta-feira, 16 de abril de 2008

Python é muito porco!

Depois de receber um e-mail do chefe dizendo "ainda vão ouvir falar muito de Python" resolvi ler um tutorial para não ficar com cara de tacho nas conversas do café.

Já no capítulo 4 me deparo com a seguinte bizarrice: o escopo é definido a partir da identação do código! Até pode parecer uma idéia interessante mas se com marcações explicitas, como chaves ou as palavras chave "begin" e "end", já cometemos erros imagine sem!

Sem falar que usar identação automática em Python nem pensar.

Se liga no exemplo:

print "Imprime os números pares até 20"
n = 1
while n <= 20:
if n % 2 == 0:
print n
n = n + 1
print "Saiu do 'while' porque não está identado!"

segunda-feira, 7 de abril de 2008

O cara é notícia em Ribeirão Preto!


Saimos na capa deste domingo no jornal local de Ribeirão Preto! No alto está o Cerqueira e carregando ele o Júnior. Ao lado sou eu, sou eu, sou euuuu!

sexta-feira, 4 de abril de 2008

Salvar como...

Nota rápida: para forçar o browser abrir a janela de "salvar como" em ASP.NET basta usar o header Content-Disposition passando como valor attachment; filename="nome_do_arquivo":


string path = "caminho_do_arquivo.txt";
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + path + "\"");
Response.TransmitFile(MapPath(path));
Response.End();

quarta-feira, 2 de abril de 2008

Parâmetros de métodos não admitem valores padrão em C#

Dei de cara com esta mensagem hoje ao tentar criar um método com um parâmetro com valor padrão assim como costumava fazer em C++.

Metodo(string p1, bool p2 = false)


Em C++ é possível chamar apenas:

a.Metodo(p1);

Pois o compilador gera na verdade:

a.Metodo(p1, false);


Em C# isto não é permitido já que o correto é usar sobrecarga:

class A
{
public void Metodo(string p1, bool p2)
{
// (...)
}
public void Metodo(string p1)
{
// O valor do segundo parametro pode vir de um arquivo de configuração
Metodo(p1, false);
}
}


É menos conveniente implementar mais um método, ainda mais em um método com muitos parâmetros. No entanto, desta maneira o valor padrão pode ser carregado de uma arquivo de configuração podendo ser alterado sem a necessidade de recompilar o programa.

http://blogs.msdn.com/csharpfaq/archive/2004/03/07/85556.aspx

terça-feira, 1 de abril de 2008

Atribuição dinâmica de valor em atributos usando reflection

Estamos criando uma classe responsável por carregar os campos de um arquive de lote. Para cada atributo desta classe desejamos atribuir um campo do arquivo. Como é muito trabalhoso criar, uma a uma, as atribuições de um layout de mais de 80 campos uptamos por usar reflection.

Segue um exemplo simplificado da solução que adotamos:

class Teste
{
public int attrib1 = 0;
public string attrib2 = null;
}

class Program
{
static void Main(string[] args)
{
Teste teste = new Teste();

FieldInfo fiAttrib1 = teste.GetType().GetField("attrib1");
fiAttrib1.SetValue(teste, 0);

FieldInfo fiAttrib2 = teste.GetType().GetField("attrib2");
fiAttrib2.SetValue(teste, "abc");

Console.WriteLine("Attrib1: {0}\nAttrib2: {1}", teste.attrib1, teste.attrib2);
}
}


Na pratica os campos do arquivo são lidos de um arquivo de configuração. Ainda, como os atributos da classe são privados se faz necessário passar BindingFlags.Instance BindingFlags.NonPublic como parametro do método GetField