# Reading reference variable alters said reference variable

So here’s the method:

``````    public Act[] Orientate(ActionType type, ActionDirection direction)
{
Act[] orientatedAct = referenceActions[(int)type].acts;

foreach (Act _act in orientatedAct)
{
Vector2 rotatedOrigin = new Vector2(_act.origin.x, _act.origin.y);
if (_act.origin.x > -2)
rotatedOrigin = Quaternion.Euler(0, 0, (90 * -(int)direction)) * new Vector2(_act.origin.x, _act.origin.y);
Vector2 rotatedDirection = Quaternion.Euler(0, 0, (90 * -(int)direction)) * new Vector2(_act.direction.x, _act.direction.y);
_act.origin = new Vector2Int(Mathf.RoundToInt(rotatedOrigin.x), Mathf.RoundToInt(rotatedOrigin.y));
_act.direction = new Vector2Int(Mathf.RoundToInt(rotatedDirection.x), Mathf.RoundToInt(rotatedDirection.y));
}
return orientatedAct;
}
``````

…and for some reason of another, each time I call it, it alters a value within the referenceActions array. referenceActions is a serialized array used for me to define what the actions are. I don’t reference referenceActions anywhere else, so I’m stumped as to why it’s being changed. It seems to apply the rotation to `referenceActions[(int)type].acts[0].direction`.

Any help is appreciated. Happy to provide more details.

So what is happening is → you are creating a new variable, BUT, you are assigning the new variable to the same memory location as the old one. Meaning when you do this:

`````` Act[] orientatedAct = referenceActions[(int)type].acts;
``````

they are actually sharing memory locations even if they are not the same variable. For example look at the following little program (you can test in https://dotnetfiddle.net/):

``````public static void Main()
{
int[] test = new int[]{ 1, 2, 3};
int[] test2 = test;
test2[0] = 5;

foreach (var item in test)
Console.WriteLine(item);
//Output --> 5
//Output -->  2
//Output -->  3
}
``````

And that is what is happening to yours. To overcome this you need to create a variable with its own memory space. This can be easily done throught the Clone function:

``````Act[] orientatedAct = (Act[]) referenceActions[(int)type].acts.Clone();
``````

Hope this helped.