James Legg
James Legg

Reputation: 5

Unnecessary assignment of a value to 'player"

I am having a problem assigning values in my function. Here is my code

//Player cents
private int add_cents = 3;
public int player_1, enemy_1, enemy_2, enemy_3;


    public void players_ready()
{
    add_cents_player(player_1, add_cents);
}

public void add_cents_player(int player, int cent_v)
{
    player = player + cent_v;
}

I want to be able to call this function and input whoever is the active player (player) and increase their value by (cent_v). However, player = player + cent_v; is saying "Unnecessary assignment of a value to 'player" and I don't understand why. It wouldn't be possible to hard code, as it is dependant on what who is the active player.

Upvotes: 0

Views: 955

Answers (3)

derHugo
derHugo

Reputation: 90813

int is a value type. It is passed by value meaning the player will actually be a copy of player_1. If you then change the player inside your method this doesn't affect in any way the player_1 since it is no reference and no relationship between them.

It looks like what you wanted to do would be using ref in order to "force" the value to be passed by reference

public void players_ready()
{
    add_cents_player(ref player_1, add_cents);
}

public void add_cents_player(ref int player, int cent_v)
{
    player += cent_v;
}

thus that after calling players_ready the value player_1 is actually increased

Upvotes: 1

sommmen
sommmen

Reputation: 7658

There are 2 ways to pass a variable to a function. 1 is by reference, meaning you pass a reference to a variable into the function. This is what happens with variables of type object - not the whole object's memory is copied and supplied to the function, but only an address to the piece of memory where that object resides.

For int, float etc. this is different. The values are passed by value.

Also see the relevant msdn docs.

There is a fundamental difference between the two options: reference types are passed by reference and can be altered and the original object also gets altered. E.g. this works:


class MySimpleObject // an object is a reference type
{
   public int someValueType; // int is a value type
}

...

var x = new MySimpleObject();
myFunc(x); // increment x.someValueType by 5


This does not count for objects passed by value, which is what happens with int, as its a value type. Therefore your function does nothing, because its only manpulating the local value, the reference is not passed.


var player_1 = 5;
add_cents_player(player_1, 15); 
// Player_1 is still 5
add_cents_player(player_1, 15); 
// Player_1 is still 5

...


And thats what the compiler is complaining about; you're adding a value to the local parameter in the function. But since you don't return this, or read the value at some point the compiler is like 'hey this code does nothing, and therefore its better to remove it.

Upvotes: 1

dimitar.d
dimitar.d

Reputation: 653

One option is to change the method return type:

    private int add_cents = 3;
    public int player_1, enemy_1, enemy_2, enemy_3;

    public void players_ready()
    {
        player_1 = add_cents_player(player_1, add_cents);
    }
    public int add_cents_player(int player, int cent_v)
    {
        return player + cent_v;
    }

Upvotes: 2

Related Questions