Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

NEDM64

Como dar acesso a uma variável partilhada pelo programa.

Mensagens Recomendadas

NEDM64    0
NEDM64

Ora bem, estou a escrever o meu primeiro programa em C#...

Então é o seguinte.

No Program.cs, tenho lá um namespace com duas classes minhas.

Uma usa outra, até...

Quero criar uma instância da tal classe, que seja acessível a todas as janelas do programa (incluindo a principal).

Onde é que eu deverei criar a tal instância?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

Podes usar um Singleton se apenas quiseres uma instância dessa classe no programa. Aqui fica um template que faz isso mesmo:

using System.Reflection;

namespace Genoverse.Patterns
{
public class Singleton<T> where T : class
{
	static Singleton()
	{
	}
  
	public static readonly T Instance =
		typeof(T).InvokeMember(typeof(T).Name,
	                           BindingFlags.CreateInstance |
		                       BindingFlags.Instance |
		                       BindingFlags.NonPublic,
		                       null, null, null) as T;
}
}

Para criar uma class usando o template basta fazeres:

class Exemplo : Singleton<Exemplo> 
{
    private Exemplo() { . . . }
    
    . . .
}

Depois para aceder a esta instância única da classe basta fazeres:

Exemplo.Instance.Method();

Atenção que este template usa uma técnica chamada lazy instantiation, que significa que a instância da classe só é criada quando a acedes pela primeira vez. Não me lembro se o template é thread-safe, mas penso que sim.

Outra técnica de fazer o que tu queres é usares uma propriedade ou uma variável estática ou uma lista dentro de uma classe, onde guardas as instâncias que crias. Tens várias maneiras de fazer isso.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
NEDM64    0
NEDM64

@Triton: ah?  :shocking: não percebi nada dessa cena de Singleton, mais uma "técnica" do que o método básico.

Não há nenhum sítio onde possa fazer um MyClass MyInstance = new MyClass();?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

@Triton

Acho que estás a complicar... O problema não requer algo assim tão complexo (em comparação).

@NEDM64

Se bem percebi, tens uma classe e queres puder aceder a determinada instância dessa classe em qualquer sitio do programa correcto? Supondo que não modificaste a estrutura geral dos programas em C#, tens uma classe estática chamada Program com o método main (também estático) lá dentro, correcto?

Basta fazeres:

public static MyClass MyInstance = new MyClass();

Para acederes:

Program.MyInstance.MetodoExemplo();

É uma forma (simples) de o fazer...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

@Triton

Acho que estás a complicar... O problema não requer algo assim tão complexo (em comparação).

Agora é que vi que é o primeiro programa em C#, talvez seja uma solução um pouco mais avançada.

NEDM64, qualquer dúvida apita.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
NEDM64    0
NEDM64

@Triton

Acho que estás a complicar... O problema não requer algo assim tão complexo (em comparação).

@NEDM64

Se bem percebi, tens uma classe e queres puder aceder a determinada instância dessa classe em qualquer sitio do programa correcto? Supondo que não modificaste a estrutura geral dos programas em C#, tens uma classe estática chamada Program com o método main (também estático) lá dentro, correcto?

Basta fazeres:

public static MyClass MyInstance = new MyClass();

Para acederes:

Program.MyInstance.MetodoExemplo();

É uma forma (simples) de o fazer...

Entao tenho assim

namespace bibliotecas_jeitosas
{
   class MyClass
   {
      // codigo
   };
}

namepace programinha
{
   
   static class Program
   {
      public static MyClass MyInstance = new MyClass();
      public void Main()
      {
      // programa
      }
}

Já vi que deu! Obrigado aos dois. Infelizmente, cada vez que tenho que aceder á MyInstance, tenho de usar Program.MyInstance :P...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

Mas isso é assim que funciona, acedes à classe e depois ao objecto... Qual é o mal de ter Program antes? Se não gostas do nome, cria outra classe estática com outro nome e faz a mesma coisa...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
NEDM64    0
NEDM64

Mas isso é assim que funciona, acedes à classe e depois ao objecto... Qual é o mal de ter Program antes? Se não gostas do nome, cria outra classe estática com outro nome e faz a mesma coisa...

O grande mal do C#, para mim, é que é tudo . não sei quê, . não sei quê... LOL!

A grande vantagem, é que não interessa a ordem pela qual as classes são escritas, por exemplo... E over-rides, etc...  :smoke:

Já agora, como é que acedo a um controlo, de uma janela para outra?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled
O grande mal do C#, para mim, é que é tudo . não sei quê, . não sei quê... LOL!

Desculpa mas este comentário é um bocadinho ridículo, mesmo que seja na brincadeira, não tem lógica nenhuma.

E essa da "grande vantagem", nem se quer percebi...

Acedes ao controlo da mesma maneira que acedes a outra coisa qualquer que este numa classe diferente. Uma "janela" (Form) é uma classe, logo, desde que a classe seja pública e o controlo que queres aceder também (ou então internal), basta fazeres como te disse anteriormente.

Recomendo-te a estudar o básico de C# e/ou POO, porque não me parece que saibas.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
NEDM64    0
NEDM64

Desculpa mas este comentário é um bocadinho ridículo, mesmo que seja na brincadeira, não tem lógica nenhuma.

E essa da "grande vantagem", nem se quer percebi...

Acedes ao controlo da mesma maneira que acedes a outra coisa qualquer que este numa classe diferente. Uma "janela" (Form) é uma classe, logo, desde que a classe seja pública e o controlo que queres aceder também (ou então internal), basta fazeres como te disse anteriormente.

Recomendo-te a estudar o básico de C# e/ou POO, porque não me parece que saibas.

Eu sei o que estou a fazer.

Antes, só tinha trabalhado em C++.

Em C++, podias, dentro do programa (no caso do C#), meter logo um objecto, no C#, tens de meter uma classe, e depois meter objectos lá dentro).

Não sei como é o C++ com GUI, antes, também só tinha trabalhado com a consola.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

Eu sei o que estou a fazer.

Antes, só tinha trabalhado em C++.

Em C++, podias, dentro do programa (no caso do C#), meter logo um objecto, no C#, tens de meter uma classe, e depois meter objectos lá dentro).

Não sei como é o C++ com GUI, antes, também só tinha trabalhado com a consola.

Não percebi bem o que queres dizer com isso. Acho que queres dizer que em C++ os programas começam numa função main(), enquanto em C# o programa começa a executar num método estático Main() numa classe, mas mesmo assim não tem grande lógica criticar a linguagem por isso...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade