DUVIDA SIMPLES SOBRE DIGITA?ÃO DE CÓDIGOS C#

KERPLUNK 08/08/2016 14:32:20
#465625
Resposta escolhida
Sobre a sintaxe do C#:
As chaves(blocos de código) são necessárias para separar escopo de código. Por exemplo, a ação de um condicional(if). Os blocos são necessários quando a ação desse condicional possui mais de uma linha. é exatamente isso. Você pode ter um condicional com uma só linha e isso dispensa o uso de blocos, mas não os torna proibidos. Veja o exemplo:

if (Clima.Chovendo)
MessageBox.Show([Ô]Chuva caindo[Ô]);

if (Clima.Chovendo)
{
MessageBox.Show([Ô]Chuva caindo[Ô]);
}

if (Clima.Chovendo == true)
{
MessageBox.Show([Ô]Chuva caindo[Ô]);
}

if (Clima.Chovendo == true)
MessageBox.Show([Ô]Chuva caindo[Ô]);



Todos os blocos acima são equivalentes, ou seja, fazem exatamente a mesma coisa. Uns possuem as chaves, outros não. é por isso que o bloco de código(chaves) é opcional e não é colocado automaticamente ao se digitar [Ô]if[Ô]. Então isso significa que a produtividade é largamente afetada, não é? Errado. Você possui a opção de Snippet de código. Elas são EXTREMAMENTE úteis no quesito produtividade. O problema é que a maioria não consegue utilizar os snippets de forma correta e produtiva. Suponhamos que você queira fazer uma operação simples, como gravar os dados de uma textbox no banco de dados. Seria mais ou menos assim:

SqlConnection cn = new SqlConnection([Ô]minha string de conexão[Ô]);
SqlCommand cmd = new SqlCommand([Ô]Insert Into Receitas(Codigo, Descricao) Values (@Codigo, @Descricao)[Ô]);
cmd.Parameters.AddWithValue([Ô]@Codigo[Ô], txtCodigo.Text);
cmd.Parameters.AddWithValue([Ô]@Descricao[Ô], txtDescricao.Text);
cmd.ExecuteNonQuery();

Simples não? Pois é, mas digamos agora que você queira que todo esse código só seja executado se tiver algo escrito em [Ô]txtDescricao[Ô]. Logicamente você vai ao início, do código e digita [Ô]if (txtDescricao.Text != [Ô][Ô])[Ô] depois coloca a abertura da chave, acha onde você quer que termine e coloca o fechamento da chave né? Pois é, você está fazendo da forma mais [Ô]troglodita[Ô] possível. Para ser produtivo, você vai usar os snippets de código. Você vai marcar todo o código que você quer e usar as teclas de atalho [Ô]CTRL + K[Ô] seguidas de [Ô]CTRL + S[Ô], isso vai abrir uma lista de snippets possíveis de serem aplicados à blocos de texto, que são vários, incluindo o [Ô]if[Ô] que é o que você vai selecionar. O script do snippet, vai colocar todo o código que você marcou dentro das chaves, colocar o [Ô]if[Ô] no topo e posicionar o cursor nele, onde você vai digitar o seu condicional.
Se você experimentou fazer isso no seu Visual Studio, você deve ter percebido vários outros [Ô]snippets[Ô] de código ali, inclusive o [Ô]try...catch[Ô] e vários outros. Isso quer dizer que você pode fazer o mesmo procedimento: Marcar o bloco de código(com ou sem o if incluido, você quem sabe), usar as teclas [Ô]CTRL K, CTRL S[Ô], escolher o snippet [Ô]try...catch[Ô] e imediatamente todo o seu bloco de código, vai estar com tratamento de exceção. No final, você vai ter um código assim:

if (txtDescricao.Text != string.Empty)
{
try
{
SqlConnection cn = new SqlConnection([Ô]minha string de conexão[Ô]);
SqlCommand cmd = new SqlCommand([Ô]Insert Into Receitas(Codigo, Descricao) Values (@Codigo, @Descricao)[Ô]);
cmd.Parameters.AddWithValue([Ô]@Codigo[Ô], txtCodigo.Text);
cmd.Parameters.AddWithValue([Ô]@Descricao[Ô], txtDescricao.Text);
cmd.ExecuteNonQuery();

}
catch (Exception)
{
throw;
}
}

A única parte que você realmente escreveu é a parte lá de dentro do if, todo o resto foi [Ô]cercado[Ô] com blocos [Ô]if[Ô] e [Ô]try...catch[Ô].

A sequência de teclas de atalho [Ô]CTRL K, CTRL S[Ô] é referente ao comando [Ô]Surround With[Ô], que está disponível quando você marca qualquer texto e clica com o botão direito no texto marcado.

Snippets de código, podem ser [Ô]construídos[Ô], ou seja, você faz todo o seu código pré-pronto e digita somente as partes que você realmente altera. Se quiserem, posso fazer um vídeo mostrando como snippets podem ser úteis quando se trata de produtividade.
JCM0867 08/08/2016 20:49:57
#465647
KERPLUNK
Tu é o cara hen! Entendi 100% tua ótima explicação.
Deu até mais vontade de aprender C#

Achei na internet um conversor de código de VB para C#, tipo o Google Tradutor, poderá ser útil.
http://converter.telerik.com/

Ultima pergunta antes de Fechar o post.
Fazendo testes aqui notei que ele coloca um [txt-color=#e80000]throw;[/txt-color] no final de alguns blocos
Não entendi pra que serve

Muito obrigado
KERPLUNK 08/08/2016 21:26:08
#465650
A palavra chave [Ô]throw[Ô], serve para [Ô]lançar[Ô] uma exceção. Quando você está usando encadeamento de função(um método que chama outro, que chama outro...), isso é chamado [Ô]Stack[Ô], ou pilha. Essa pilha, pode ter dezenas(eu já vi até centenas) de encadeamentos. Quando ocorre uma exceção tratada em qualquer ponto desse pilha, o caminho inverso é feito, repassando essa exceção para o método que o tenha chamado, seguindo até o método principal, que geralmente é na UI. Resumindo, [Ô]throw[Ô] está geralmente dentro de um escopo catch, mas pode perfeitamente estar em qualquer ponto do código, inclusive lançando exceções personalizadas(que aliás, possuem um snippet pronto para serem criadas como classe). Então você pode criar exceções personalizadas e lançá-las ao invés de exceções do framework. Por exemplo, suponhamos que você queira uma exceção genérica para qualquer problema de conexão de banco de dados, ao invés das várias possíveis. Você pode criar uma classe de exceção e lançar essa sua exceção ao invés de qualquer uma que possa ocorrer durante uma tentativa de conexão. é meio difícil de entender assim explicando, então, um exemplo:
Sua classe de exceção(criada com snippet de código):

[Serializable]
public class ConexaoException : Exception
{
public ConexaoException() { }
public ConexaoException(string message) : base(message) { }
public ConexaoException(string message, Exception inner) : base(message, inner) { }
protected ConexaoException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}



Tentando conectar ao banco e lançando a exceção personalizada em caso de erro:

using (SqlConnection cn = new SqlConnection([Ô]sua connection string[Ô]))
{
try
{
cn.Open();
}
catch (Exception ex)
{
throw new ConexaoException(string.Format([Ô]Houve um erro ao conectar no banco de dados: {0}[Ô], ex.Message));
}
}


Essa classe de exceção, pode ser colocada em qualquer lugar, desde que seu namespace seja acessível de onde quer que se queira lançar as exceções. é boa prática colocar em um namespace próprio para isso, como [Ô]SuaAplicacao.Exceptions[Ô]. Alguns puristas, sugerem até mesmo separar as exceções em namespaces diferentes conforme seu uso como [Ô]SuaAplicacao.Exceptions.Gerais[Ô] e [Ô]SuaAplicacao.Exceptions.Estoque[Ô], onde cada um desses namespaces se refere à um determinado [Ô]módulo[Ô] da sua aplicação. Eu acho desnecessário, uma alocação simples, já é suficiente para separar. Como uma exceção personalizada é uma classe como qualquer outra, ela pode até mesmo conter propriedades que você julgar necessário, por exemplo, você poderia adicionar nessa classe [Ô]ConexaoException[Ô] uma propriedade do tipo string que conteria a connectionstring usada, você poderia também alterar o construtor dela para fazer alguma rotina de log ou tentar conectar em um banco de dados [Ô]backup[Ô], ou enviar um e-mail para o administrador do sistema, enfim, qualquer coisa que você quiser.
O importante aqui é lembrar que qualquer método que chame o método em que a tentativa de conexão é feita(e por sua vez pode lançar uma exceção, ainda que personalizada), também deve estar contido em blocos try...catch, para que essa exceção seja passível de ser [Ô]pega[Ô] na camada onde uma mensagem deve ser exibida ou ação paralisada ou qualquer coisa que se queira fazer em caso de erro, que pode perfeitamente ser capturada assim:

try
{
Conectar();
}
catch (ConexaoException ex)
{
MessageBox.Show(ex.Message);
}

Dentro do método [Ô]Conectar[Ô], em algum ponto teríamos:

using (SqlConnection cn = new SqlConnection([Ô]sua connection string[Ô]))
{
try
{
cn.Open();
}
catch (Exception ex)
{
throw new ConexaoException(string.Format([Ô]Houve um erro ao conectar no banco de dados: {0}[Ô], ex.Message));
}
}


O que aconteceria, é que se um erro ocorresse ao tentar conectar ao banco de dados, uma messsagebox seria exibida com a mensagem: [Ô]Houve um erro ao conectar no banco de dados: UMA_MENSAGEM_DE_ERRO_QUALQUER[Ô]. Isso fica muito mais agradável ao usuário e ele não entra em pânico tão facilmente, pois uma mensagem legível aparece e não uma [Ô]caralhada[Ô] de código de stack o que parece muito mais assustador.

Essa prática, também é excelente para aplicações Web, onde em caso de erro, uma mensagem pode ser exibida muito menos feia que a maldita tela de erro padrão do ASP.NET.
JCM0867 08/08/2016 23:11:39
#465651
Entendi pra que serve
Mas qual snippet foi usada para criar a classe de exceção?
KERPLUNK 08/08/2016 23:21:27
#465652
Simplesmente digite [Ô]ex[Ô]. Isso deve mostrar isso uma opção como na imagem. Então basta pressionar TAB duas vezes. Isso vai fazer com que o snippet de código seja incorporado e seu cursor estará com o texto [Ô]My[Ô] de [Ô]MyException[Ô] selecionado, então basta digitar o nome que quer dar à sua exceção.
Resumindo:
Digite [Ô]ex[Ô] e isso vai mostrar o menu.
Pressione TAB duas vezes
Digite o nome da sua exception
Pressione enter

As primeiras vezes parece meio difícil lembrar disso, mas trabalhar com teclas de atalho faz com que sua produtividade suba nas alturas. Usar os snippets disponíveis também. Escrever snippets personalizados ainda mais. isso mesmo, você pode escrever snippets prontos para qualquer tarefa que queira. Conectar no banco de dados, executar um script SQL, criar uma thread, qualquer coisa que você faça com frequência.
JCM0867 08/08/2016 23:52:41
#465653
é isso aí,
Valeu pela paciência e disposição a ajudar.

Agradeço tb ao DS2T, JABA, entre outros
Obrigado
T+
Página 2 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas