C# - Criando objetos :  escolhendo a melhor opção
 Veja as opções para criar objetos na linguagem C# e escolha a melhor opção.

O mundo da programação é rico e vasto em recursos e opções e quase sempre você terá diversas maneiras de alcançar o mesmo resultado. Com o tempo e a experiência acabamos escolhendo a opção que geralmente trás o melhor resultado com o menor custo.

Pensando nisso o que seria mais fácil do que criar um objeto ?

Na verdade, mesmo essa simples tarefa, pode ser feita de pelo menos 5 formas diferentes. Então veremos cada uma delas e vamos analisar os prós e contras de cada uma e tentar escolher a opção mais adequada. Claro que isso pode variar para cada projeto.

1- Criando um objeto com a palavra-chave new

Essa talvez seja a maneira mais simples de criar um objeto. Usar a palavra new.

public class PedidoService
{
     private readonly IEmailService _emailService;

     public PedidoService()
     {
        _emailService = new EmailService();
      }

Lembrando que no C# 10 temos uma nova sintaxe para usar o new:


EmailService emailService = new();
 

Vejamos a seguir os prós e contras desta abordagem:

Pros:

Contras:

2- Delegar a criação do objeto ao contêiner DI

Nesta opção a responsabilidade de criar o objeto pode ser delegada a um componente separado, o contêiner de injeção de dependência.

public class PedidoService
{
     private readonly IEmailService _emailService;

     public PedidoService(IEmailService emailService)
     {
        _emailService = emailService;
      }
}

Prós:

Contras:

3 - Criando um objeto usando Reflection

A próxima abordagem para instanciar um objeto é o mecanismo Reflection:

namespace Teste
{

   public class Demo
   {
       public string Valor { get; set; } = "001";
   }

   public void Create()
   {
       Type codeType = Assembly.GetExecutingAssembly().GetType("Teste.Demo");

       //Cria a instância
       object codeInstance = Activator.CreateInstance(codeType);

       PropertyInfo codePropertyInfo = codeType.GetProperty("Valor");

       string codigo = (string)codePropertyInfo.GetValue(codeInstance, null);

    //...
   }
}

Prós:

Contras:

4 - Obter o objeto a partir de um Pool de Objetos

Nesta opção ao invés de criar um objeto, o objeto já pré-criado pode ser carregado de um pool de objetos. Obviamente, o objeto deve ser criado antecipadamente com uma palavra-chave new ou usando Reflection, mas isso só precisa ser feito uma vez.

int arraySize = 100000;

//Pega um array a partir do pool

int[] arr = ArrayPool<int>.Shared.Rent(arraySize);

//Uso o array

//Retorna o array para pool
ArrayPool<int>.Shared.Return(arr);
 

Prós:

Contras:

5- Criando um objeto pela sua desserialização

Nesta última maneira de criar um objeto podemos fazer a sua desserialização de um binário, JSON ou outros formatos. É claro que o objeto deve ser serializado previamente e armazenado na memória ou no armazenamento externo de arquivos.

Nota: A serialização é o processo de armazenar um objeto , incluindo todos os atributos públicos e privados para um stream. A desserialização é o processo inverso.

[Serializable]
public class Pessoa
{
    public string Nome { get; set; }
    public string Email { get; set; }
}

public Pessoa CreatePessoa()
{
     using FileStream fs = new FileStream("SerializedPessoa.dat", FileMode.Open);
     BinaryFormatter formatter = new BinaryFormatter();
     Person pessoa = (Pessoa)formatter.Deserialize(fs);
     return pessoa;

 

Prós:

Contras:

E após essas apresentações, qual á melhora abordagem ?

Ora, ora, não existe abordagem melhor ou pior. Tudo depende do seu caso específico.

A única maneira de encontrar uma solução que resolva seu problema da maneira mais eficiente é pesar seus requisitos em relação aos prós e contras de cada abordagem disponível até encontrar a melhor opção.

E estamos conversados.

"Porque foi do agrado do Pai que toda a plenitude nele habitasse,
E que, havendo por ele feito a paz pelo sangue da sua cruz, por meio dele reconciliasse consigo mesmo todas  as  coisas, tanto as que estão na terra, como as que estão nos céus."
Colossenses 1:19,20

Referências:


José Carlos Macoratti