C# COM VISUAL STUDIO – NÍVEL INTERMEDIÁRIO

Primeiro programa no padrão c# .net

Variáveis

Escopo de variáveis

  1. Delegates e Eventos:

Em C#, delegates são tipos seguros que representam referências a métodos com uma assinatura específica. Eles são usados principalmente para implementar eventos e callbacks.

Exemplo de delegate:

csharpCopiar código// Definição de delegate
public delegate void MeuDelegate(string mensagem);

// Uso do delegate em um método
public class MinhaClasse
{
    public void ExibirMensagem(string mensagem)
    {
        Console.WriteLine(mensagem);
    }
}

// Exemplo de utilização do delegate
class Program
{
    static void Main(string[] args)
    {
        MinhaClasse obj = new MinhaClasse();
        MeuDelegate delegate1 = new MeuDelegate(obj.ExibirMensagem);
        delegate1("Olá, mundo!");
    }
}

Eventos são mecanismos baseados em delegates que permitem que uma classe notifique outras partes do código quando algo interessante acontece.

Exemplo de evento:

csharpCopiar código// Definição da classe que contém o evento
public class Publicador
{
    public event MeuDelegate MeuEvento;

    public void DispararEvento(string mensagem)
    {
        if (MeuEvento != null)
            MeuEvento(mensagem);
    }
}

// Uso do evento
class Program
{
    static void Main(string[] args)
    {
        Publicador publicador = new Publicador();
        MinhaClasse obj = new MinhaClasse();

        // Inscrição no evento
        publicador.MeuEvento += obj.ExibirMensagem;

        // Disparo do evento
        publicador.DispararEvento("Evento disparado!");
    }
}
  1. Reflection:

Reflection permite examinar e manipular metadados de tipos em tempo de execução. É útil para tarefas como descobrir informações sobre classes, interfaces, métodos, propriedades, etc.

Exemplo de uso básico de reflection:

csharpCopiar códigousing System;
using System.Reflection;

public class MinhaClasse
{
    public void MeuMetodo()
    {
        Console.WriteLine("Método executado!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Type tipo = typeof(MinhaClasse);
        MethodInfo metodo = tipo.GetMethod("MeuMetodo");

        if (metodo != null)
        {
            object instancia = Activator.CreateInstance(tipo);
            metodo.Invoke(instancia, null);
        }
    }
}

Neste exemplo, typeof(MinhaClasse) obtém o tipo da classe MinhaClasse, e tipo.GetMethod("MeuMetodo") retorna o método MeuMetodo. metodo.Invoke(instancia, null) invoca o método MeuMetodo em uma instância criada dinamicamente de MinhaClasse.

  1. Serialização de Dados:

A serialização é o processo de converter objetos ou estruturas de dados em um formato que pode ser armazenado ou transmitido e posteriormente reconstruído.

Exemplo de serialização em JSON:

csharpCopiar códigousing System;
using System.IO;
using System.Text.Json;

public class Pessoa
{
    public string Nome { get; set; }
    public int Idade { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Pessoa pessoa = new Pessoa { Nome = "João", Idade = 30 };

        // Serialização para JSON
        string jsonString = JsonSerializer.Serialize(pessoa);
        Console.WriteLine(jsonString);

        // Desserialização de JSON para objeto
        Pessoa pessoaDesserializada = JsonSerializer.Deserialize<Pessoa>(jsonString);
        Console.WriteLine($"Nome: {pessoaDesserializada.Nome}, Idade: {pessoaDesserializada.Idade}");
    }
}

O exemplo acima usa o namespace System.Text.Json para serializar uma instância da classe Pessoa em JSON e depois desserializá-la de volta para um objeto Pessoa.

  1. Desenvolvimento de Aplicações Multithreaded:

Multithreading é o uso de várias threads simultaneamente para melhorar a eficiência e a capacidade de resposta de aplicações.

Exemplo de uso de threads em C#:

csharpCopiar códigousing System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // Exemplo de uso de threads
        Thread thread1 = new Thread(new ThreadStart(Executar));
        thread1.Start();

        Thread thread2 = new Thread(new ParameterizedThreadStart(ExecutarComParametro));
        thread2.Start("Thread 2");

        // Aguardando as threads terminarem
        thread1.Join();
        thread2.Join();

        Console.WriteLine("Todas as threads terminaram.");
    }

    static void Executar()
    {
        Console.WriteLine("Thread 1 executando.");
        Thread.Sleep(2000); // Simula uma operação demorada
        Console.WriteLine("Thread 1 terminou.");
    }

    static void ExecutarComParametro(object parametro)
    {
        string nome = (string)parametro;
        Console.WriteLine($"{nome} executando.");
        Thread.Sleep(3000); // Simula uma operação demorada
        Console.WriteLine($"{nome} terminou.");
    }
}

Neste exemplo, Thread é usado para criar e iniciar threads. Thread.Sleep é usado para simular operações demoradas. Join é usado para esperar que as threads terminem antes de continuar.

  1. Padrões de Projeto (Design Patterns):

Padrões de projeto são soluções comprovadas para problemas recorrentes de design de software. Eles promovem a reutilização de código, a flexibilidade e a manutenibilidade.

Exemplo de padrão Singleton:

csharpCopiar códigopublic class Singleton
{
    private static Singleton instancia;

    private Singleton() { }

    public static Singleton Instancia
    {
        get
        {
            if (instancia == null)
                instancia = new Singleton();
            return instancia;
        }
    }

    public void ExibirMensagem()
    {
        Console.WriteLine("Método da instância Singleton.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Singleton s1 = Singleton.Instancia;
        Singleton s2 = Singleton.Instancia;

        s1.ExibirMensagem();
        s2.ExibirMensagem();

        Console.WriteLine(s1 == s2); // True, mesmo objeto
    }
}

No exemplo acima, Singleton garante que apenas uma instância da classe seja criada e fornece um ponto de acesso global para essa instância.

ATIVIDADE

Como se chama o mecanismo baseado em delegates que permite que uma classe notifique outras partes do código quando algo interessante acontece?

  • a) Delegates
  • b) Eventos
  • c) Métodos
  • d) Propriedades

Qual namespace é utilizado para realizar operações de serialização em JSON em C#?

  • a) System.Xml.Serialization
  • b) System.Runtime.Serialization
  • c) System.Data.Serialization
  • d) System.Text.Json

Para que serve o método Thread.Sleep em C#?

  • a) Para finalizar uma thread.
  • b) Para iniciar uma nova thread.
  • c) Para simular uma operação demorada.
  • d) Para esperar por um evento.

Qual padrão de projeto garante que uma classe tenha apenas uma instância e fornece um ponto de acesso global para essa instância?

  • a) Factory
  • b) Singleton
  • c) Observer
  • d) Prototype

O que o Reflection permite fazer em C#?

  • a) Invocar métodos dinamicamente em tempo de execução.
  • b) Gerar código automaticamente.
  • c) Criar novos tipos de dados.
  • d) Realizar cálculos matemáticos complexos.