Распространяет ли и влияет ли объект новые значения на переменные, первоначально установленные из объектов, обратно? - PullRequest
0 голосов
/ 13 февраля 2019

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

MyPanel AttackerCell = Frm_Menu.GameBoard.SelectedCell;
MyPanel DefenderCell = this;

int AttackerStrength = AttackerCell.PlayerOnCell.ST;
int DefenderStrength = PlayerOnCell.ST;

if (DefenderStrength > AttackerStrength && AttackerCell.PlayerOnCell.Skills.Contains("Dauntless"))
{
    Random Dice = new Random();
    int DiceResult = Dice.Next(1, 7);

    if (DiceResult + AttackerStrength < DefenderStrength)
    {
        AttackerStrength = DefenderStrength;
    }
}

PlayerOnCell имеет тип игрока player и имеет целочисленное свойство ST (Strength)

игнорируя операторы if, они относятся к правилам игры, строка AttackerStrength = DefenderStength;владею моей проблемой.

Будет ли новое назначение AttackerStrength распространяться обратно и влиять на AttackerCell.PlayerOnCell.ST?Если да, то как мне это остановить?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Нет, потому что в этом сценарии AttackerStrength объявлен как локальная переменная;присвоение AttackerStrength только изменяет локальную переменную.Тем не мение!Это на самом деле нюансированная тема:

Если локальной переменной является объект , то распространяются изменения в состоянии объекта , так как только один объект ;то есть

SomeObject foo = PlayerOnCell.Foo;
// ...
foo.Strength = 42; // will be seen everywhere; only one object

Но если локальной переменной является struct , то этого не происходит , как присвоение foo копий значение:

SomeStruct foo = PlayerOnCell.Foo;
// ...
foo.Strength = 42; // not propagated - foo is a copy

(кстати, эта путаница - хорошая причина избегать изменяемых структур - они злые! структуры редки, и в этом редком случае, когда вы их создаете, вы должны по умолчанию использовать readonly struct).

Аналогично, если вы используете «ref return» и «ref locals», то вы можете в конечном итоге изменить удаленное состояние - но вы не можете сделать это случайно, так как для этого требуются определенные ref синтаксис и актуальный компилятор:

ref int DefenderStrength = ref PlayerOnCell.ST;
// ...
DefenderStrength = 42; // this will have changed the state inside PlayerOnCell

Это также относится к сценарию SomeStruct, если используются "ref return" и "ref locals":

ref SomeStruct foo = ref PlayerOnCell.Foo;
// ...
foo.Strength = 42; // updates the value from PlayerOnCell

(на данный момент мы смешиваем несколько очень продвинутых концепций, поэтому очень редко вам нужно знать об этом последнем сценарии в реальном коде; и если вы находятся в этом мире, почти всякую путаницу здесь можно избежать, сказав, что все struct должны быть либо readonly struct (default) или ref struct (если оно обязательно должно быть изменяемым) - это указание останавливает срабатывание почти всех ловушек)

0 голосов
/ 13 февраля 2019

Он не будет распространяться назад, потому что был назначен по значению, а не по ссылке.

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