Логическое значение как параметр метода не изменяет состояние - PullRequest
0 голосов
/ 01 января 2019

Я хочу изменить состояние логического значения в функции.Моя функция имеет 4 параметра, а четвертый - это bool, который по умолчанию имеет значение true, но я хочу изменить его состояние на false внутри функции.

Я вызываю мой метод, следующий,

SlotCheck("Red", "red_small_c", puzzle_9, GameControl.control.scoreRedGems, GameControl.control.stone_9);

GameControl.control.stone_9 по умолчанию имеет значение true.Он должен стать ложным, как только для visibilty установлено значение false .. но это не происходит ... stone_9 остается верным.

public void SlotCheck(string gemColor,string slotColor,GameObject puzzleStuk,int scoreGem,bool Visibility)
{
    if (DragHandler2.itemBegingDragged.name.Contains(gemColor) && DragHandler2.itemBegingDragged.transform.parent.name == slotColor)
    {
        Debug.Log(DragHandler2.itemBegingDragged.name);
        Visibility=false;
        puzzleStuk.SetActive(visibility);
        Debug.Log(GameControl.control.stone_9);    //true
        DragHandler2.itemBegingDragged.SetActive(false);

    }

Я ожидаю, что GameControl.control.stone_9 изменит свое состояние на false, потому что я меняюсостояние параметра (Visibility) равно false, но GameControl.control.stone_9 остается истинным.

Ответы [ 3 ]

0 голосов
/ 01 января 2019

1- В SlotCheck четыре параметра должны быть ref bool Visibility

или

Внутри оператора if вы должны сделать это

GameControl.control.stone_9 = false;
0 голосов
/ 01 января 2019

Я полагаю, что у вас сложилось впечатление, что изменение значения аргумента будет отражено для вызывающей стороны (вашего первого блока кода).Это не так, если вы не используете ref или out для параметра / аргумента.Это будет работать до тех пор, пока GameControl.control.stone_9 является полем, а не свойством.

Короче говоря, аргументы передаются по значению, если только не используются эти ключевые слова.(для ссылочных типов это также верно, но это немного сложнее, так как копируется ссылка, а не сам объект)

Другие ответы объяснили синтаксис (необходимо использовать ref для обоихаргумент и параметр.)

Кроме того, один совет: никогда не используйте заглавные буквы в ваших переменных или параметрах, поскольку, когда вы это делаете, большинство читателей C # увидят их как свойства в содержащем классе, что приведет к путанице.

0 голосов
/ 01 января 2019

Если вы хотите изменить значение переменной внутри метода, вы должны определить его как ref:

public void SlotCheck(string gemColor,string slotColor,GameObject puzzleStuk,int scoreGem,ref bool Visibility)
{
   //method stuff
     Visibility = false;
}

, а затем вызвать свой метод следующим образом:

SlotCheck("Red", "red_small_c", puzzle_9, GameControl.control.scoreRedGems, ref GameControl.control.stone_9);
...