C# – Para Iniciantes – Parte 1 – Variáveis, Passagem por Valor ou Referência.

Olá Pessoal, Vou fazer uma série sobre (C Sharp) C# para iniciantes.

Atendendo à diversos pedidos vou procurar abordar de uma forma diferente a transferência de conhecimentos nessa linguagem, apostila e tutorial tem de monte na internet, a intenção não é essa, vamos abordar necessidades reais de quem quer dar os primeiros passos em C# e agora quer aprender mais.

Só para começar, um pouquinho de história:
O C# é uma linguagem derivada do C++, mas também tem base em Java e Object Pascal.
Criada em meados de 1999 por Anders Hejlsberg (pai do Turbo Pascal e Delphi) vem desde 2001 ganhando espaço e se tornou uma das linguagens mais populares da atualidade.

Vamos dar o primeiro passo:

Variáveis

Toda variável é uma alocação de uma quantidade de memória, é nesse espaço de memória que está armazenado o conteúdo da variável, internamente uma variável possui um ponteiro, o ponteiro para o sistema operacional é um endereçamento físico de memória, serve para localizar onde está armazenado tal dado.

A declaração de variável em C#:

Tipo NomeDaVariavel;

int MeuInteiro; 

Deve-se sempre inicializar uma variável:

int MeuInteiro = 0; 

Stack e Heap

O gerenciamento da memória no C# é feito em duas áreas de memória, o Stack e o Heap.

O Stack é uma área bem pequena de memória (alguns KB) e funciona no formato de pilha.

Pilha é uma estrutura de dados em que a inserção e a remoção de elementos de uma sequência se faz pela mesma extremidade, geralmente designada por topo da pilha”

Ou seja, o último que entra na pilha é o primeiro que sai (LIFO – Last-In-First-Out)
Qualquer dado inserido na Stack é automaticamente retirado automaticamente após a conclusão do processo que a alocou, isso livra o programador de se preocupar com isso.
Quando a Stack atinge seu tamanho máximo temos um problema muito conhecido como “stack overflow”. Os dados armazenados na Stack são chamados de “Value Types”.

A Heap é uma área de memória bem grande, diferente da Stack que é pequena, seu tamanho muda dinamicamente conforme o uso, a Heap é acessada indiretamente, por meio de referência, por isso chamamos os dados da Heap de “Reference Type”.
Existe um processo chamado Garbage Collector (GC) que é responsável pela limpeza desta área de memória.

O custo de se criar um objeto na Heap é muito maior do que na Stack, sendo assim na área de memória Stack nós temos os Value Types a seguir:
Tipos numéricos (int, long, short etc), ponto flutuante (float, double), decimal, booleanos (true e false) e estruturas definidas pelo usuário (struct).

Na Heap nós temos os Reference Types do tipo: Classes, Interfaces e Delegates.

As características dos tipos alocados em cada uma dessas áreas são as seguintes:

Value Types:

  • Uma variável deste tipo contém o valor, e não um endereço de referência para o valor;
  • Derivam de System.ValueTypes;
  • Variáveis de escopo local precisam ser inicializadas antes de serem utilizadas;
  • Atribuir o valor de variável a outra, implicitamente, é feita uma cópia do conteúdo da variável. Sendo assim, qualquer alteração no conteúdo de uma delas, não afetará a outra. Quanto maior for um objeto deste tipo mais custosa será sua cópia.

Reference Types:

  • Uma variável contém a referência (ou endereço) para o objeto que está na Heap;
  • Atribuir o valor de uma variável para outra faz uma cópia da referência, e não do próprio objeto. Ou seja, não é feita a cópia do objeto, e sim do endereço de memória do objeto, o que não gera muito custo para objetos grandes;
  • São alocados na Heap e seus objetos são coletados pelo Garbage Collector;
  • São passados por referência, enquanto que Value Types são passados por valor. Ou seja, a alteração de um objeto afetará todas as instâncias que apontam para ele.

Boxing e Unboxing

Boxing é o processo de converter um “Value Type” para o tipo de object ou a qualquer tipo de interface implementada por este tipo de valor “Reference Type”.

Unboxing extrai o “Value Type” do objeto. Transforma um objeto em um tipo simples.

      // Vamos fazer um Boxing
      int i = 123;
      object obj = i;

      // Agora vamos fazer Unboxing
      obj = 123;
      i = (int)obj;

Simples né?

O Garbage Collector (GC)

Como na Heap todos objetos são referenciados, o GC verifica se existe alguma variável fazendo referência a determinado objeto, caso não encontre ele desaloca “Coleta” aquela área de memória.

Um fato interessante, por mais que se chame o Garbage Collector a sensação que temos é de que ele irá entrar em ação no mesmo instante, mas não, estamos apenas sinalizando a ele. “Passe por aqui GC”.

Não é recomendado chamar manualmente o GC, deixe com que ele trabalhe de sua forma.
Abaixo estamos chamando o GC, porém sinalizando para que ele aguarde o trabalho em memória terminar:

      GC.Collect();
      GC.WaitForPendingFinalizers();

Passagem de Valor ou por Referência

Dada as funções:

      public void FuncaoPorValor(int numero)
      {
          numero = 10;
      }

      public void FuncaoPorReferencia(ref int numero)
      {
          numero = 10;
      }

A única diferença entre as duas é que uma trata a variável “numero” passada por valor e a outra trata a variável “numero” por referência.

Observemos os resultados:

      int variavel = 0;
      FuncaoPorValor(variavel);

      MessageBox.Show("Resultado = " + variavel.ToString());
      // Resultado = 0 Foi passada uma cópia da variável pro método.

      int variavel2 = 0;
      FuncaoPorReferencia(variavel2);

      MessageBox.Show("Resultado = " + variavel2.ToString());
      // Resultado = 10 Foi passada a referência da variável pro método.

Normalmente quando passamos uma variável para uma função, estamos passando uma cópia dela para a função trabalhar.
Caso essa cópia seja modificada a original permanece igual.

Quando passamos a variável por referência, um ponteiro de memória está sendo passado, ou seja, caso seja modificada a própria variável está sendo alterada, pois o ponteiro de memória aponta para a alocação original.

E por hoje ficamos por aqui.
Espero que aproveitem e em caso de dúvidas podem postá-las nos comentários.

Referências:

27 pensou em “C# – Para Iniciantes – Parte 1 – Variáveis, Passagem por Valor ou Referência.

  1. Eduardo, quais conhecimentos você julga necessários para quer entrar em uma empresa na parte de desenvolvimento?

    Atualmente trabalho como suporte tecnico, mais gostaria de migrar de área. Compre um DVD com um curso de C# da treinamentos ti
    (http://www.treinamentosti.com.br/lojaComprar.aspx) e estou estudando, no entanto gostaria de saber o que é necessário para conseguir trabalho na área (ex: conseguir criar uma tela de cadastro, relatórios, etc..).

    Grato desde já pela atenção.

    • Olá Marcelo!
      Obrigado por participar!

      Primeiramente é necessário ter lógica de programação, você pode aprender lógica com qualquer linguagem, mas como está indo com o C# procure por apostilas que introduzam a lógica de programação com C#, recomendo você aprender o Framework do .Net após dominar os conceitos de lógica. Sugiro também após isso estudar os conceitos de OO (Orientação a Objeto)

      Como você já está em TI fica mais fácil, faça alguns projetos pessoais, sistemas simples mas que atendam cadastro em banco de dados, alguma implementação de regra de negócios, relatórios também é uma boa sim. Com isso você ganha experiência para poder fazer alguma participação em um projeto onde você trabalha ou buscar alguma vaga que seja de nível iniciante, em sites tipo Apinfo você encontra vagas desse nível.

      Podendo lhe ajudar mais em algo fico a disposição.
      Abraço!

  2. Olá eduardo, prazer. Tenho 17 anos e tenho esse fascínio por informática desde os meus 14. Vez ou outra eu lia alguns artigos sobre programação, mas nunca levei a coisa a sério. Nunca fiz um curso, porconta de minha condição financeira. Pois bem, ontem eu decidi ir a a fundo e li boa parte dos artigos em seu site que, por sinal, é muito bom. Sinceramente, não sei absolutamente nada de programação, mas já escolhi a linguagem que irei aprender – é C# – abordei artigos introdutórios , afinal, pretendo desenvolver programas para desktop e pesquisei sobre as linguagens que me possibilitam desenvolver os mesmos. Possuo vasta facilidade em aprender quaisquer coisas relacionadas a informática, mas com toda sinceridade, me responda – é possível aprender a programar sozinho? Empenho e dedicação não me faltarão e temos ótimos instrutores na internet e, graças a meu bom DEUS, você é um deles. Terminei o ensino médio no fim do ano passado… faculdade, só em 2014 – curso – analise e desenvolvimento de sistemas. Até lá, por meio dos estudos na internet, serei capaz de atuar no ramo de desenvolvimento?

    EM SUMA,

    – POR ONDE DEVO COMEÇAR? (ESTUDAR O QUE AO INICIO)
    – DEVO ESCOLHER MAIS ALGUMAS LINGUAGENS?
    – ONDE ESTUDAR? (SITES E ETC…)

    Obs: separo a partir de hoje 2 horas do meu dia, para estudar c# em seu site.

    Forte abraço amigo, fique com DEUS. Continue a nos ajudar 😉

    Sem mais,

    Erick.

    • Olá Erick,

      Parabéns pelo seu interesse em entrar nesse universo não existe idade para começar, então sinta-se preparado para todos os desafios que essa área pode nos propor.

      Eu aprendi a programar sozinho, naquela época não existia Google, a única forma que tinha contato era por livros, mesmo lendo eu não tinha a ferramenta para praticar aquilo que estudei, e mesmo assim aprendi.
      Hoje em dia com os mecanismos de pesquisas, sites especializados, vídeo aulas gratuitas e etc qualquer pessoa pode aprender e muito rapidamente, basta ter foco e não desistir no primeiro problema.

      Sugiro que instale o Visual Studio em sua máquina e inicie algumas práticas:

      Lógica de programação (condicionais, laços de repetição, estruturas, métodos, objetos, comportamentos).
      Acesso a banco de dados (ADO.Net, Entity Framework, Programação SQL)
      Orientação a objetos (Estude muito bem isto)
      Comunidade (Fóruns, Grupos de discussão e eventos)

      A linguagem C# é uma ótima escolha, quem sabe programar faz isso em qualquer linguagem, então preocupe-se nesse momento em aprender a programar bem e com C# isso vai ser totalmente possível, além de te capacitar para um mercado que está muito em alta.

      Separe todo tempo possível, 2 horas é o mínimo que eu estudaria por dia.

      Certamente eu começaria com lógica de programação, procure por artigos e vídeos que propõem a falar sobre este assunto.

      Continue participando e comentando no site 🙂
      Abraço!

  3. Eduardo, Parabéns pelo teu site cara!
    Me ajudou muito a entender este assunto de Stack e Heap…
    continue postando seu conhecimento!!! estou sempre acompanhando.

    Abraço!

  4. Boa tarde Eduardo!
    Parabéns de verdade pela sua iniciativa!

    Atualmente sou da área de Infra por ter me faltado oportunidade anterior para ingressar em programação, mas isso não foi nenhum pouco ruim para mim, pois agora, com um bom conhecimento de Infra de TI creio que terei um diferencial na área de programação.

    Na empresa em que trabalho tenho o privilégio de poder aprender um pouco de programação C# como os desenvolvedores, comecei a pouco tempo, A pessoa que me ajuda já me passou alguns conceitos de orientação à classes, orientação a objeto e até linq com banco de dados, já estudei um pouco de lógica na faculdade, mas creio que ainda eu precisa de uma base bem forte sobre esses conceitos essenciais de programação em C#. Onde e como você me orientaria a buscar esse conhecimento?

    • Olá Diego!

      Muito obrigado pelo feedback!

      Minha sugestão é que você certifique-se em desenvolvimento C#, assim você terá de estudar todo o contexto desta linguagem, aprofundando-se.

      Logo após recomendo estudar orientação a objetos, DDD, TDD.

      Comece a buscar livros destes autores:
      – Robert Martin (Uncle Bob)
      – Martin Fowler
      – Kent Beck

      Já lhe passei trabalho para mais de ano rs 🙂
      Abraços!

  5. ria que você me desse dicas para começar a Programar, então é que eu estudo de Noite e trabalho de dia e sempre quando acho apostilas explicações para Baixar eu Baixo em meu computador. Gostaria de pedir algumas dicas para começar a programar, ja escolhi a linguagem é C# .

    Obs: Sobre Artigos, livros, sites etc e como fazer para driblar essa carga horaria de tempo que gasto, para sobrar tempo para aprender .

    • Olá!

      No seu caso é dedicação, estudar pelo menos 2h por dia, X dias da semana, no começo é mais difícil, cortar final de semana, horas de sono, tudo é valido.

      Sobre literaturas, me envie um e-mail que lhe indico algumas.

      Abs!

  6. Eduardo,

    São pessoas como você que merecem todo o respeito que alguém tem para dar.

    Irei acompanhar o curso todo e ainda este ano pretendo me encaixar em uma vaga no desenvolvimento no meu trabalho, está de parabéns.

  7. Existe um erro na linha 8 do bloco resultados.” FuncaoPorReferencia(variavel2);”

    O correto seria FuncaoPorReferencia(ref variavel2);

  8. Olá, parabéns pelos materiais, muito bons.
    Poderia indicar alguns livros (português ou inglês) voltados para a parte Web do ASP.NET C# (WebAPI, WebForms, MVC, etc)?

    Já abusando um pouco, se puder indicar também livros nas áreas de Banco de Dados e JavaScript, ajudaria muito nos meus estudos 🙂

    Obrigado,

  9. Bom dia,

    Está de parabéns amigo, Conteúdo certinho, ajuda pra caramba, merece todo o respeito do mundo.
    Por mais pessoas generosas em compartilhar conhecimento, como você!
    Atenciosamente,Dimitri.

    • Certa vez li a seguinte frase “…o que não se pode fazer por amor, não deve ser feito de outro jeito, porque não dá resultado”, se for para ofender é melhor que não corrija ou vai acabar se tornando pior do que a pessoa que cometeu o erro.

      Sem mais.

    • Pessoal, todos estão aqui para aprender (inclusive eu). Vamos pegar leve com nossos colegas, alguns nem mesmo falam português (usam tradutor para perguntar em pt-BR)

  10. Estou começando com o C# na faculdade e estou com muita dificuldade para para entender. Em casa infelizmente não tenho um computador legal para me atender, o que fica mais complicado. O que puder me ajudar, agradeço.
    Boa tarde.

  11. Olá gostaria de aprender c#
    Você poderia me indicar caso você tenha o inicio do inicio o passo a passo.
    Quais programas usar para poder ir aplicando o que estarei aprendendo.
    Obrigado

  12. Pingback: C# – Para Iniciantes – Parte 7 – Generics C# | unnygames

  13. Pra mim tá muito difícil aprender esse programa mas estou pra pirar com isso quero aprender pois minha aulas estão sendo difícil

  14. Bom dia amigo, boa semana.
    Gostaria de ouvir sua opinião!
    Estou aprendendo c# (autodidata), com a ajuda de todo material disponível gratuitamento pois vivo em desemprego e isolado do mercadp TI a anos;
    Eduardo, no meu primeiro exrcício estou convertendo algo ja existente e construido por mim em VB6.
    Ai´está a pergunta, no VB6 ao copiar um label quando collar o sistema pergutava se eu quizesse gerar controle array (label1[0], label1[1]…)
    é possivel no c#?
    Eu localizei um jogo da forca, e copie a sintaxe, mas acredito que a versão so c# seja antiga e aceitável.
    estou utilizando o C# comunty (gratuito-2017…)
    e quando compilo ele não me deixe utilizer a sintxe:

    private void IniciarLabels(int wLenVet)
    {
    if (wLenVet<0) { wLenVet =35};
    int tamanhoVetor = wLenVet;
    labels = new Label[tamanhoVetor];
    wLenVet=7
    for int wi = 0; wi < wLenVet; wi++{

    labels[wi] = new Label();
    labels[wi].Font = new Font("Arial", 48F, FontStyle.Bold);
    labels[wi].ForeColor = SystemColors.Active.Caption;
    labels[wi].Size = new Size(118,47);
    labels[wi].Text = Convert.ToString(wi-1);
    // Coord. = X =48 (inicia), Y = 172 (1° linha) (P.A.= 126, x 6) (final X=708,Y=172)
    // " " = Y =172 (inicia), (NA 1° LINHA) (P.A. = 60, x 5)
    labels[wi].Location = wi == 0 ? new Point(X, Y) : new Point(labels[wi – 1].Location.X + 126),Y);
    this.Controls.Add(labels[wi]);
    }
    }

Os comentários estão fechados.