Jump to content

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


NEDM64
 Share

Recommended Posts

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?

Link to comment
Share on other 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.

<3 life

Link to comment
Share on other sites

Guest id194

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

Link to comment
Share on other 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.

<3 life

Link to comment
Share on other 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 😛 ...

Link to comment
Share on other sites

Guest id194

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

Link to comment
Share on other 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?

Link to comment
Share on other sites

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

Link to comment
Share on other 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.

Link to comment
Share on other 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...

<3 life

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.