Diferença entre uma classe e um struct(Reference Type vs Value Type)

Você já teve o problema de alterar o valor de uma variável e outra variável também ter o valor alterado, se já teve esse problema continue lendo esse post.

Qualquer classe criada em C# é um reference type, e qualquer struct é uma Value Type para entender melhor o que significa isso vamos a uma explicação mais especifica desses tipos:

Reference Type:  Na variável será armazenado apenas um endereço da memoria aonde está o objeto, e mão a variável por completa, esses tipos de variáveis, as vezes possuem o método Clone exatamente para criar uma copia do objeto e retornar a referencia desse segundo objeto na variável. Ao atribuir a uma variável o valor de outra variável reference type, o que está sendo armazenado nessa nova variável é o endereço da mesma variável com isso ao alterar uma a outra também se mostra alterada para exemplificar o conceito de Reference Type:

 

Qualquer classe(class) criada é do tipo reference type, e o tipo String também é reference Type

 

Value Type: Os objetos Value type se comportam da forma oposta aos Reference Type, um objeto Value Type armazena o objeto inteiro nele, e com isso quando esse valor é atribuido a outra variavel a primeira variavel possui um objeto e a segunda possui um segundo objeto, como mostra a imagem a seguir:

 

Qualquer estrutura(struct) criada é do tipo value type, e os tipos primitivos(int,long,bool, etc…) e o DataTime também são value Type.

 

 

 

Pergunta: Uma variável de um enumerado é Value Type ou Reference Type?

Resposta: ela é do tipo Value Type

 

Anúncios

Copia de Stream não está validando com Hash MD5

Eu sei que o titulo do post não é auto-explicativo, por isso vou explicar o real problema que ocorreu:
Eu precisava transferir um arquivo grande via WCF, buscando na internet decidi fazer a transferencia desse arquivo por partes( enviando o arquivo em pedaços, cada requisição seria certa de 1MB), após o termino do envio do arquivo eu precisava gerar um Hash MD5 do meu arquivo no cliente e um hash no servidor para comparar, porém esse hash nunca era igual.

Bom após me debater muito pensando que era algum problema do WCF decidi fazer uma aplicação de testes bem rapida e percebi que não era problema do WCF e sim da copia do arquivo que eu estava criando, o código que eu estava utilizando para efetuar a copia do arquivo era o seguinte:

StreamReader stream = new StreamReader(textBox1.Text);
 using (FileStream stream2 = File.Create(textBox2.Text))
 {
var bytes = default(byte[]);
var buffer = new byte[10000];
       var bytesRead = default(int);
       while ((bytesRead = stream.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
       {
             stream2.Write(buffer, 0, <span style="text-decoration: underline;"><strong>buffer.Count()</strong></span>);

}
 }

Porém quando gerava o Hash do arquivo em MD5 e comparava com original sempre era diferente ao percebi que o buffer.Count() nem sempre seria a quantidade de bytes a ser gravado no arquivo, e possivelmente era por isso não deu outra apenas uma uma alteração consegui resolver meu problema, segue como ficou o código arrumado.


StreamReader stream = new StreamReader(textBox1.Text);

using (FileStream stream2 = File.Create(textBox2.Text))
 {
      var bytes = default(byte[]);
      var buffer = new byte[10000];
      var bytesRead = default(int);
      while ((bytesRead = stream.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
      {
           stream2.Write(buffer, 0, bytesRead);

}
 }

Trace com Asp.Net

O ASP.Net possui uma forma visualizar os gargalos na performace de seu site utilizando o Trace, essa tecnologia da mesma forma que te ajuda, se não for configurada de forma correta pode gerar uma falha muito grave de segurança em seu site.

Para que serve o trace ?

O Trace serve para conseguir ter um controle melhor na analise da performace em seu site, além disso é possivel descobrir falhas de segurança com o relatorio gerado.

Como configurar o trace ?

Para habilitar o trace do ASP.Net é ncessário  adicionar essa configuração no arquivo web.config entre a tag <system.web>

Exemplo de configuração:

<system.web>
<trace enabled="true" localOnly="true" pageOutput="true"/>
</system.web>

Algumas das opções de configuração importantes:

  • Enabled:  Para habilitar e desabilitar a geração do trace
  • localOnly: Quando verdadeiro apenas a máquina local tem acesso ao conteudo do relatorio do Trace, quando falta  qualquer pessoa que acesse o site terá acesso
  • pageOutput: Quando verdadeiro mostra o relatório na propria página, quando falso é necessário acessar o relatorio completo no arquivo trace.axd

Adicionando texto no Relatorio do Trace ?

O Framework possui uma classe chamada TraceContext que é utilizada para adicionar alguma informação customizada no Relatório do trace.Ele pode ser acessado de duas formas, diretamente de um code-behind de uma ASPX assim(this.Trace) ou dessa forma para outros lugares (System.Web.HttpContext.Current.Trace) sempre tomando cuidado de garantir que o metodo utilizado é chamado por uma página Web. Os pontos interessantes desse objeto são:

  • Warn: Esse método é utilizado para adicionar no relatório de trace  alguma informação importante ou de aviso que ocorreu ou que pode ocorrer algum erro, as mensagem criadas por esse método ficam em vermelho no Relatório
  • Write: Esse método é utilizado para adicionar no relatório de trace alguma informação mais ara algum controle interno de seu sistema, como confirmar que fez alguma rotina ou não, as mensagens criadas por esse método ficam da cor normal do texto
  • IsEnabled: Essa propriedade expõem a propriedade que foi configurada no web.config, é aconselhável não alterar o valor dela e deixar ela sempre utilizar o que está configurado no web.config, outra boa prática é sempre que adicionar uma nova linha no trace verificar se essa propriedade é verdadeira, para quando for desligado o trace economizar recurso do servidor

Como acessar relatório completo do Trace ?

Para acessar o relatório com as informações de cada comando executando voce apenas precisa colocar a raiz do seu site /trace.axd

Exemplo:

Página: http://localhost:1020/Default.aspx

Relatório do Trace: http://localhost:1020/trace.axd

O que o trace mostra ?

Algumas da informações mais importantes que são mostradas no relatório gerado são

Informações sobre o comando Executado no servidor:

O tempo que foi utilizado por cada evento dá página:

Os controles que estão na página e quanto de memoria cada um está utilizando: