изменение постоянной переменной класса c # - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно изменить переменную класса в методе, который находится внутри класса, как я могу это сделать?

class MainGame
{
    public string Connected_IP = " ";
    public short Is_Connected = 0;
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.Run(new MainConsole());
        MainConsole m = new MainConsole();
    }
    public ref string checkCommands(string command)
    {
        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 ref Connected_IP;
    }
}

Я ожидаю, что Connected_IP изменится.но вместо этого переменная изменилась только в методе, я попытался использовать команду ref, но все еще без изменений, что я могу сделать?

public partial class MainConsole : Form
    {
        MainGame m = new MainGame();
        MainGame j = new MainGame();
        private void ConsoleInput2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Return)
            {
                Text_IP_Connected.Text = m.checkCommands(ConsoleInput2.Text);
                if (m.Is_Connected == 1) vic_sft.Enabled = true;
                else vic_sft.Enabled = false;           
            }
        }

1 Ответ

0 голосов
/ 31 марта 2019

В приведенном ниже примере я создаю и храню экземпляр 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);
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...