Como funcionam os tipos por referência, em .NET ?

Os tipos por referência ocupam espaço duas vezes. Uma na stack e outra na heap. Na stack existe um apontamento para o dado correspondente na heap. Se estes tipos por referência forem destruídos, apenas seu ponteiro é destruído. O Garbage Collector percebe os dados na heap que não possuem contra-referências na stack e o excluem na sua limpeza.
Os tipos por referência são especialmente úteis. Eles são responsáveis por guardar tipos mais complexos como classes. Estes tipos normalmente ocupam grande espaço em memória. Quando um tipo por referência é utilizado como parâmetro para um método, este parâmetro aponta para o tipo por referência. E quando um tipo por referência é atribuído por outro, existe um apontamento interno, diferentemente do tipo por valor. Isto é de grande valia para objetos pesados.
    Os tipos por referência mais fundamentais são:
  • System.Object
  • System.String
  • System.Text.StringBuilder
  • System.Array
  • System.IO.Stream
  • System.Exception

Por que utilizar StringBuilder a string?

As strings são classes prontas do .NET para tratamento de arrays de caracteres. Enquanto um char[] utiliza a classe System.Array, um string utiliza a classe System.String. A classe System.String se especializa no tratamento de array de caracteres trazendo uma série de benefícios na sua manipulação.
As strings em .NET e em outras linguagens apresentam uma limitação: as strings são imutáveis. Isto significa que é impossível alterar uma string em .NET. Esta afirmativa é estranha por que é comum a alteração de string, porém internamente a CLR realiza uma manobra para que isto funcione corretamente. Quando uma string é definida, uma posição de memória é alocada na stack para apontar para um endereço da heap que conterá a string. Se esta string for alterada, uma nova entrada será feita na stack e outra cópia será feita na heap. E pelo menos o .NET apaga o endereço de memória da stack que contém a antiga string. Desta forma na próxima passagem do Garbage Collector, todas as strings antigas serão excluídas. Veja o código – comentado – a seguir que mostra este problema:
  public static void Main()
        {
// System.Int32 ocupa 4 Bytes somente na stack
            int valor1 = 300;
int valor2 = 600;
            int valor3 = 900;

            string valor;          
// System.String ocupa o equivalente a um System.IntPtr na stack.
//Este valor varia de acordo com a plataforma
            /* Como este valor não está instanciado, apenas ocupa a stack, e não aponta para a heap */

            valor = "Esta string é um teste";     
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado (embora já estivesse)*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/

            valor += "\nO valor 1 é de " + valor1; 
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/

            valor += "\nO valor 2 é de " + valor2; 
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/

            valor += "\nO valor 3 é de " + valor3; 
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/


            // Imprime na tela o valor da string
            Console.Write(valor);


        }
A aplicação citada gasta:
  • 3 System.Int32
    • 4 Bytes cada
    • 12 Bytes da stack
    • Gastos corretamente
  • 5 System.IntPrt
    • O valor varia de acordo com a plataforma
    • Gasta no mínimo 5 bytes da stack
    • Os 5 System.IntPrt representam indiretamente a mesma System.String
  • 5 System.String
Agora, tendo o problema bem claro, então qual é a solução? O .NET oferece um objeto que resolve esta questão: System.Text.StringBuilder. Diferentemente da string, ele tem a função de montar strings e, apenas, uma string é criada na memória após uma manipulação de string. Veja o código que segue, ele resolve o problema apresentado no código anterior:
public static void Main()
        {

// System.Int32 ocupa 4 Bytes somente na stack
            int valor1 = 300;      
            int valor2 = 600;
            int valor3 = 900;
                             
// System.Text.StringBuilder equivale a um System.IntPtr na stack. Este valor varia de acordo com a plataforma
System.Text.StringBuilder sb = new StringBuilder();

            sb.Append("Esta string é um teste");
            sb.Append("\nO valor 1 é de " + valor1);
            sb.Append("\nO valor 2 é de " + valor2);
            sb.Append("\nO valor 3 é de " + valor3);

// Um novo espaço (System.IntPtr) é ocupado na stack
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/
            string valor = sb.ToString();
          
            // Imprime na tela o valor da string
            Console.Write(valor);

        }
Desta forma, o resumo dos gastos são:
  • 3 System.Int32
    • 4 Bytes cada
    • 12 Bytes da stack
    • Gastos corretamente
  • 2 System.IntPtr
    • O valor varia de acordo com a plataforma
    • 1 para apontar para um System.String, criado corretamente
    • 1 para apontar para um System.Text.StringBuilder, criado corretamente
  • 1 System.String
  • 1 System.Text.StringBuilder

O que é Iniciativa Passiva?


Ouvi falar que Napoleão Bonaparte separava seu exército em quarto classes. Ignorantes com iniciativa, ignorantes sem iniciativa, inteligentes com iniciativa e inteligentes sem iniciativa.

Achei bacana e quis entender mais. Para Napoleão, os inteligentes com iniciativa eram os mais preparados para ficar afrente de setores estratégicos, como os generais; Os inteligentes sem iniciativa guiavam a frente de batalha, como sargentos de capitães; Os ignorantes sem iniciativa ficaram na frente de batalha, como soldados e cabos; e por fim, os ignorantes com iniciativa. Estes não prestavam! Criavam as piores atrocidades e atrapalhavam o desenrolar das estratégias. Estes não eram admitidos em seu exército.
Levei este pensamento para o ambiente de trabalho e percebi que é bastante razoável. Mas o que me deixa mais intrigado neste ambiente é o que chamo de Iniciativa Passiva.



O que é iniciativa passiva?
Já aconteceu contigo, ou já viu acontecer: alguém que reclama de tudo, por ter a solução de todos os problemas que existem ou que venham a existir. Sejam problemas da empresa ou do país. O mais interessante é que estas pessoas não são a solução. Sabe por quê? Porque são boas em julgar de longe. Talvez por medo ou por falta de capacidade nunca tomam iniciativa. Para apoiar este formato de pensamento entram as frases feitas. Elas são ótimas quando bem utilizadas. Normalmente quem usa não às questiona. Pode ser útil para convencer ignorantes, mas ajudam a consolidar a iniciativa passiva. Isto é iniciativa passiva.

Você sabe com quem está falando?

Alguém já te perguntou, ou você já ouviu alguém ser perguntado: "Você sabe com quem está falando"? Ou ainda pior, você já perguntou isso para alguém?
Eu vi um vídeo fantástico sobre este tema. Trata-se de uma palestra do Filósofo Sergio Cortella feita para o Banco do Brasil. Possívelmente o público desta palestra já vivenciou esta pergunta.


Como gerar documentação automaticamente em .NET?

Gerar documentação para os projetos de desenvolvimento nem sempre são tratadas como importantes. Nem todos pensam (ou sabem pensar) que o legado do projeto é da empresa e não do programador. A solução de documentação que quero falar é muito boa e eficiente, independente do projeto em questao ter a documentação como um artefato formal.




Sandcastle - Help File Builder
Esta solução gera documentação apartir dos comentários de 3 barras feito no código. A documentação gerada é semelhante a documentação do MSDN ou dos SDKs em documentos HTML ou CHM (Help do Windows).

/// <summary>
/// Responsável por realizar cálculos
///
</summary>
public class Calculadora
{
    ///
<summary>
    /// Útil para realizar somatório de números inteiros
    ///
</summary>
    /// <param name="i">Primeiro número a participar do somatório</param>
    /// <param name="j">Segundo número a participar do somatório</param>
    /// <returns>Retorna a soma entre dois valores</returns>
    int soma(int i, int j)
    {
        return i + j;
    }
}

Faça download do SandCastle
http://shfb.codeplex.com/


Como instalar o SandCastle?
1: Faça download do instalador, descompacte e execute-o
Instalação do SandCastle

2: Avance a instalação
Avance e leia atentamente todos os pontos da instalação.
Quando chegar em "SandCastle Pacth" clique em "Apply Patch"

Configurando a instalação do SandCastle

3: Avance a instalação, novamente
Prossiga até chegar em "SandCastle Help File Builder" clique em "Install SHFB"
Instalando o SandCastle Help File Builder
SandCastle Help File Builder


4: Feito.
SandCastle instalado com sucesso.
Reinicie seu computador.
Instalação do SandCastle finalizada



Como preparar meu projeto do visual studio para gerar documentação?
1: Crie seu projeto com comentários de 3 barras
Como demonstrado no inicio do artigo.


2: Configure o projeto
Vá no "Solution Explorer" do seu projeto e clique em Propriedades
Selecionar: Propriedades do Projeto


Vá na aba "Build" e selecione o checkbox "XML documentation file"
Na aba Build, selecionar XML Documentation

3: Compile seu projeto
Vá até o local onde está o executavel ou DLL do projeto. 
Você deve encontrar um documento XML com os comentários


4: Pronto

Como utilizar o SandCastle?
1: Abra a aplicação do SandCastle
Encontra-se no menu iniciar > SandCastle Help File Builder > SandCastle Help File Builder GUI

SandCastle Help File Builder GUI


2: Crie um novo projeto
Vá no menu "File" > "New Project" e escolha um local para salvamento de seu novo projeto

Criando Projeto no SandCastle


3: Adicione arquivos para geração da documentação
Vá na aba "Project Explorer" encontrada, inicialmente, à direita.
Clique com o botão direito em "Documentation Sources" e escolha as DLLs de seus projetos e XMLs de seus comentários
Adicionando DLLs e XMLs no SandCastle

4: Gere a documentação
Vá no menu "Documentation" > "Build" e espere.
O sistema gerará logs visíveis na tela e mostrará um barra de progresso no canto inferior direito.
Gerando arquivo CHM de ajuda


5: Leia a documentação gerada
Vá na pasta onde o projeto do SandCastle, criado no passo 1, foi salvo. Encontre uma pasta chamada Help e abra o arquivo "Documentation.chm"
Abrindo arquivo .CHM gerado automáticamente


6: Pronto
Sua documentação foi gerada com sucesso
Abrindo o arquivo .CHM gerado automáticamente com base nos comentários


Obs.: Esta tarefa pode demorar. Por exemplo, tenho um documento de uns 100 métodos comentados, e umas 20 classes. Para gerar a documentação demora de 5 a 10 minutos, numa maquina de 2GB de ram.

É possível fazer diversas configurações no SandCastle. Está é a configuração mais básica. Num próximo post falo mais.

Como alterar o menu de contexto do SharePoint

Você já se perguntou como fazer para colocar o menu que aparece no item, na coluna Title, em outra coluna qualquer do SharePoint? Pois bem, um cliente me fez essa pergunta, e achei esta solução para isto.

O I love SharePoint é um projeto do CodePlex com várias ferramentas bacanas, entre elas esta solução.
 
Execute esta linha no seu Power Shell(download do PowerShell):

PS> & .\AddMenuColumn.ps1 -webUrl http://[siteSharePoint:porta]/site/subsite/ -listName "" -fieldTitle "" -addToDefaultView $true