В приведенном ниже примере я создаю и храню экземпляр MainGame в самом классе MainGame. Поскольку это делается из статического Main (), объявление также должно быть статическим. Обратите внимание, что если это объявление было сделано public
, то к нему можно получить доступ из любого места, используя синтаксис MainGame.mg
(однако это не рекомендуемый подход).
Затем мы передаем этот экземпляр MainGame в форму MainConsole через его Конструктор в строке Application.Run()
. Обратите внимание на дополнительный конструктор в MainConsole, размещенный ниже. «Ref» в типе возврата в checkCommands()
был удален, так как значение можно было изменить, используя переданную и сохраненную ссылку на MainGame, в самой MainConsole.
Класс MainGame:
public class MainGame
{
public string Connected_IP = " ";
public short Is_Connected = 0;
static MainGame mg = null; // instantiated in Main()
static void Main()
{
mg = new MainGame(); // this instance will be worked with throughout the program
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainConsole(mg)); // pass our reference of MainGame to MainConsole
}
public string checkCommands(string command) // no "ref" on the return type
{
IP_DataBase ips = new IP_DataBase();
/*checking for ips in the list*/
string[] dump;
if (command.Contains("connect"))
{
dump = command.Split(' ');
for (int i = 0; i < ips.IPS.Length; i++)
{
if (dump[1] == ips.IPS[i])
{
Connected_IP = dump[1];
Is_Connected = 1;
break;
}
else
{
Connected_IP = "Invalid IP";
Is_Connected = 0;
}
}
}
else if (command.Contains("quit")) /*disconnect command*/
{
Connected_IP = "Not Connected";
Is_Connected = 0;
}
return Connected_IP;
}
}
Здесь, в форме MainConsole, мы добавили дополнительный конструктор, который получает экземпляр MainGame. Существует поле с именем m
, типа MainGame, но обратите внимание, что нигде в этой форме мы фактически не создаем экземпляр MainGame с "new"; мы используем только переданный экземпляр. Ссылка на MainGame хранится в m
из Конструктора, поэтому ее можно использовать в других точках кода:
public partial class MainConsole : Form
{
// Note that we are NOT creating an instance of MainGame anywhere in this Form!
private MainGame m = null; // initially null; will be set in Constructor
public MainConsole()
{
InitializeComponent();
}
public MainConsole(MainGame main)
{
InitializeComponent();
this.m = main; // store the reference passed in for later use
}
private void ConsoleInput2_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return && ConsoleInput2.Text.Trim().Length > 0)
{
// Use the instance of MainGame, "m", that was passed in:
Text_IP_Connected.Text = m.checkCommands(ConsoleInput2.Text);
vic_sft.Enabled = (m.Is_Connected == 1);
}
}
}