• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

NEDM64

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

12 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@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();?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Anyway, sem InteliSense, não ia a lado nenhum!  :eek: LOL!

0

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