none
Outro alternativa ao invés de Variável Estática RRS feed

  • Pergunta

  • Senhores, boa tarde!

    Gostaria de saber quais são as alternativas que poderia utilizar ao invés de variável estáticas. Estou fazendo uma dll que vai recebendo parâmetros, tenho que ir armazenando para fazer um tratamento depois e retornar um valor para aplicação.

    Estava pesquisando na Web e encontrei algo com delegate, porém não entendo nada deste, vi alguns exemplos mas ainda não ficou 100% claro.

    1 - Quais melhores alternativas para substituir a variável estática?

    2 - Alguma referência boa para utilização de delegate?

    3 - Quais prós e contras da utilização do delegate.

    sexta-feira, 19 de novembro de 2010 17:57

Respostas

  • Renan,

    Veja bem, em uma aplicação Web, todos os clientes acessam a mesma aplicação que esta rodando no servidor no caso do .NET o IIS, se você utilizar variaveis estaticas para guardar estes dados, você tem que ter em mente que todos os clientes irão chamar a mesma função. Assim se por exemplo, 2 usuários estiverem usando o seu sistema ao mesmo tempo e chamarem esta função ao mesmo tempo, por ser estática os 2 irão "armazenar" os dados no mesmo lugar.

    Se é este o comportamento que você quer, você terá que fazer tratamentos para que o seu código seja Thread Safe, usando locks e outras tecnicas de programação Multi-Thread. Isto porque cada usuário está em uma Thread diferente.

    Confira alguns artigos sobre o assunto:

    http://www.codeproject.com/KB/threads/ThreadSafeCodeInCSharp.aspx

    http://www.albahari.com/threading/part2.aspx

     

    Quanto aos delegates, geralmente são mais usados em programação windows, um delegate é um tipo de evento, a diferença básica é que o evento só pode ser invocado da classe que o declarou, já o delegate pode ser invocado por outras classes. Veja este exemplo que eu montei:

     public class DelegateTest
     {
      public EventHandler MyDelegate;
    
      public event EventHandler MyEvent;
    
      public void PerformMyEvent()
      {
       // executa o evento...
       if (this.MyEvent != null)
        this.MyEvent(this, EventArgs.Empty);
      }
     }
    
     public class DelegateTestClass
     {
      public void Invoke(DelegateTest delegateObject)
      {
       // consumindo o delegate, neste caso você pode usar
       // = para substituir todos os delegates
       // += ou -= quando o delegate tiver que ser consumido mais de uma vez
       // você pode tambem "desliga-lo" setando como null
       delegateObject.MyDelegate = new EventHandler(delegateObject_MyDelegate);
       delegateObject.MyDelegate += new EventHandler(delegateObject_MyDelegate);
       delegateObject.MyDelegate -= new EventHandler(delegateObject_MyDelegate);
       delegateObject.MyDelegate = null;
    
       // no caso do evento, só podemos usar += ou -=
       delegateObject.MyEvent += new EventHandler(delegateObject_MyEvent);
       delegateObject.MyEvent -= new EventHandler(delegateObject_MyEvent);
    
       // executando o delegate...
       if (delegateObject.MyDelegate != null)
        delegateObject.MyDelegate(this, EventArgs.Empty);
    
       // executando o evento...
       // como o evento só pode ser executado dentro da classe que o criou, 
       // implementei um método para que o objeto delegate dispare o evento
       delegateObject.PerformMyEvent();
      }
    
      private void delegateObject_MyDelegate(object sender, EventArgs e)
      {
       System.Diagnostics.Trace.WriteLine("Delegate Disparado");
      }
    
      private void delegateObject_MyEvent(object sender, EventArgs e)
      {
       System.Diagnostics.Trace.WriteLine("Evento Disparado");
      }
     }
    
    

    At.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    domingo, 21 de novembro de 2010 13:10
  • Renan,

    Acho que você não precisa usar variáveis estáticas para isto não.

    Primeiro, que tipo de aplicação você está fazendo? Windows, Web? e como estes parâmetros serão passados para a sua DLL? É um processo em lote? Uma tela de entrada? Um web service?

    Dependendo de como você for utilizar esta DLL, você tem diversas maneiras de fazer sem usar nada estático e muito menos delegates.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sábado, 20 de novembro de 2010 01:42

Todas as Respostas

  • Renan,

    Acho que você não precisa usar variáveis estáticas para isto não.

    Primeiro, que tipo de aplicação você está fazendo? Windows, Web? e como estes parâmetros serão passados para a sua DLL? É um processo em lote? Uma tela de entrada? Um web service?

    Dependendo de como você for utilizar esta DLL, você tem diversas maneiras de fazer sem usar nada estático e muito menos delegates.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sábado, 20 de novembro de 2010 01:42
  • A aplicação é web.

    tenho um dll ela recebe parametros eu monto este parametro na dll e ela retorna da seguinte maneira

    //Código Fonte

    MinhaDLL.Teste1(strMeuValorASerFormatado);
    MinhaDLL.Teste1(strMeuOutroValorASerFormatado);
    MinhaDLL.Teste1(strOutroValorASerFormatado);

    String strStringTensa = MinhaDLL.Teste2();

    //DLL

    public static void Teste1(String strTeste){
    //trato e guardo os dados aqui
    }

    public static String Teste2()
    {
    //retorno a String aqui já tratada
    }

     

    por exemplo, ela recebe o primeiro parametro como "Eu" o segundo como "Você" e o terceiro como "Ele" e me retorna da seguinte maneira "Eu, Ele,Você"

     

    Mesmo não precisando utilizar fiquei curioso no delegate, deve ser interessante o uso dele.

     

    Obrigado.

    domingo, 21 de novembro de 2010 00:57
  • Renan,

    Veja bem, em uma aplicação Web, todos os clientes acessam a mesma aplicação que esta rodando no servidor no caso do .NET o IIS, se você utilizar variaveis estaticas para guardar estes dados, você tem que ter em mente que todos os clientes irão chamar a mesma função. Assim se por exemplo, 2 usuários estiverem usando o seu sistema ao mesmo tempo e chamarem esta função ao mesmo tempo, por ser estática os 2 irão "armazenar" os dados no mesmo lugar.

    Se é este o comportamento que você quer, você terá que fazer tratamentos para que o seu código seja Thread Safe, usando locks e outras tecnicas de programação Multi-Thread. Isto porque cada usuário está em uma Thread diferente.

    Confira alguns artigos sobre o assunto:

    http://www.codeproject.com/KB/threads/ThreadSafeCodeInCSharp.aspx

    http://www.albahari.com/threading/part2.aspx

     

    Quanto aos delegates, geralmente são mais usados em programação windows, um delegate é um tipo de evento, a diferença básica é que o evento só pode ser invocado da classe que o declarou, já o delegate pode ser invocado por outras classes. Veja este exemplo que eu montei:

     public class DelegateTest
     {
      public EventHandler MyDelegate;
    
      public event EventHandler MyEvent;
    
      public void PerformMyEvent()
      {
       // executa o evento...
       if (this.MyEvent != null)
        this.MyEvent(this, EventArgs.Empty);
      }
     }
    
     public class DelegateTestClass
     {
      public void Invoke(DelegateTest delegateObject)
      {
       // consumindo o delegate, neste caso você pode usar
       // = para substituir todos os delegates
       // += ou -= quando o delegate tiver que ser consumido mais de uma vez
       // você pode tambem "desliga-lo" setando como null
       delegateObject.MyDelegate = new EventHandler(delegateObject_MyDelegate);
       delegateObject.MyDelegate += new EventHandler(delegateObject_MyDelegate);
       delegateObject.MyDelegate -= new EventHandler(delegateObject_MyDelegate);
       delegateObject.MyDelegate = null;
    
       // no caso do evento, só podemos usar += ou -=
       delegateObject.MyEvent += new EventHandler(delegateObject_MyEvent);
       delegateObject.MyEvent -= new EventHandler(delegateObject_MyEvent);
    
       // executando o delegate...
       if (delegateObject.MyDelegate != null)
        delegateObject.MyDelegate(this, EventArgs.Empty);
    
       // executando o evento...
       // como o evento só pode ser executado dentro da classe que o criou, 
       // implementei um método para que o objeto delegate dispare o evento
       delegateObject.PerformMyEvent();
      }
    
      private void delegateObject_MyDelegate(object sender, EventArgs e)
      {
       System.Diagnostics.Trace.WriteLine("Delegate Disparado");
      }
    
      private void delegateObject_MyEvent(object sender, EventArgs e)
      {
       System.Diagnostics.Trace.WriteLine("Evento Disparado");
      }
     }
    
    

    At.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    domingo, 21 de novembro de 2010 13:10