类中的方法不会从整数参数

时间:2015-07-09 12:55:10

标签: c#

我目前只学习C#一周,所以对任何愚蠢的错误表示道歉,但我试图在switch语句中调用一个方法来取走一个在列表中声明的整数值给出该方法的参数,在这种情况下的参数是currEnemy对象的健康状况,但是当currEnemy.health值被打印到控制台时它的值不变,我无法弄清楚这是为什么。

存储currEnemy.health被long取走的整数值的列表,其中健康变量在Enemy类中设置为整数值:

public List<Weapon> myWepList = new List<Weapon>(){
    new Weapon {name = "Dagger", dmg = 10, stamDrain = 5},
    new Weapon {name = "Sword", dmg = 20, stamDrain = 20},
    new Weapon {name = "Halberd", dmg = 40, stamDrain = 20}
};

public int health{ get; set; }

玩家类中的方法应该带走&#39; dm&#39;来自enemy.health值的值并将enemy.health设置为新值:

public void charAttack(int enemyHealth)
{
    enemyHealth -= equippedWep[0].dmg;
}

然后调用上述方法的代码显示currEnemy.health的新值:

enum PlayerInput
{
    Attack,
    Block,
}

while (gameStart == true) //this part onwards is stored in the main method
{
    string playerInput = Console.ReadLine().ToUpper();
    PlayerInput inputChoice;

    Console.WriteLine("Type 'attack' to attack the enemy");

    if (Enum.TryParse<PlayerInput>(playerInput, true, out inputChoice))
    {
        switch (inputChoice)
        {
            case PlayerInput.Attack:
                currPlayer.charAttack(currEnemy.health);
                Console.WriteLine("Enemy Health is {0}", currEnemy.health);
                break;

            default:
                break;
        }
    }

}

我也很感激,如果我对我的代码提出任何一般性建议,考虑到我对C#完全陌生,那么任何有建设性的建议都会很棒,谢谢。

6 个答案:

答案 0 :(得分:4)

此方法:

public void charAttack(int enemyHealth)
{
    enemyHealth -= equippedWep[0].dmg;
}

......基本没有意义。语句enemyHealth -= ...仅影响名为enemyHealth参数。它根本不会改变currEnemy.Health - 因为method参数是按值传递的。换句话说,这个过程是:

    评估
  • currEnemy.health
  • 该值用作enemyHealth
  • 的初始值
  • 该方法执行
  • enemyHealth的最终值并未在所有
  • 中使用

有关详细信息,请参阅我的article on parameter passing

有多种方法可以解决这个问题 - 例如,您可能需要:

currPlayer.Attack(currEnemy);

Attack方法看起来像:

public void Attack(Enemy enemy)
{
    Weapon weapon = equippedWep[0];
    enemy.Health -= weapon.Damage;
}

请注意,最后一行与之前的代码非常不同,因为之后设置 enemy.Health的值...您不会只是更改参数,但对象的状态。

答案 1 :(得分:3)

您无法更改传递给函数的值。所有语言都是一样的,不仅仅是C#。

int a = 0;

function changeA(int a)
{
    a = 1;
}

print a; // show 0, not 1

您可以更改对象中包含的值:

public class Obj
{
    public int health{ get; set; }
}

var o = new Obj();
function changeHealth(Obj o)
{
    o.health = 1;
}

print o.health; // show 1

C#或其他什么,这是你需要了解的第一件事。

对于你的实际问题,这是一个建议:传递代表敌人的实际对象,而不仅仅是他的健康。然后推断出敌人物体的健康状况。

public void charAttack(Player enemy)
{
    enemy.health -= equippedWep[0].dmg;
}

while (gameStart == true) //this part onwards is stored in the main method
{
    string playerInput = Console.ReadLine().ToUpper();
    PlayerInput inputChoice;

    Console.WriteLine("Type 'attack' to attack the enemy");

    if (Enum.TryParse<PlayerInput>(playerInput, true, out inputChoice))
    {
        switch (inputChoice)
        {
            case PlayerInput.Attack:
                currPlayer.charAttack(currEnemy);
                Console.WriteLine("Enemy Health is {0}", currEnemy.health);
                break;
            default: break;
        }
    }
}

答案 2 :(得分:2)

C#按值传递ints,这意味着您只能获取方法中值的副本。要解决它,你可以像这样解析敌人对象:

public void charAttack(Enemy enemy)
{
    enemy.health -= equippedWep[0].dmg;
}

这会影响敌人的健康。

答案 3 :(得分:1)

问题在于您的charAttack方法声明。 enemyHealth参数未通过引用传递,因此您实际上正在修改变量的副本而不是原始变量(这是通过传递的)。

您可以通过引用传递参数,这意味着您修改了原始文件:

public void charAttack(ref int enemyHealth)
{
    enemyHealth -= equippedWep[0].dmg;
}

或者您可以返回修改后的结果并将原始值设置为:

public int charAttack()
{
    return equippedWep[0].dmg;
}
i = charAttack();

答案 4 :(得分:0)

您需要通过引用传递敌人的健康值。 C#默认为传递值,这意味着该方法获取它自己的值副本。传递实际的int对象通过引用传递。

答案 5 :(得分:0)

public void charAttack(int enemyHealth)
{
    enemyHealth -= equippedWep[0].dmg;
}

根据上述方法,您可能会遇到您正在经历的行为。您实际上并没有说明&#34;更改通话currEnemy.health&#34;调用此方法时,请更改enemyHealth。问题是currEnemy.health正在通过值传递(如传递文字值,而不是&#34;对象&#34;表示该值)而不是通过引用传递。

有两种(或更多)方法可以解决此问题:

一个人会使用参考敌人的健康:

public void charAttack(ref int enemyHealth)
{
    enemyHealth -= equippedWep[0].dmg;
}

并将您的方法称为:

currPlayer.charAttack(ref currEnemy.health);

或从您的方法返回新的敌人健康状况:

public int charAttack(int enemyHealth)
{
    return enemyHealth - equippedWep[0].dmg;
}

并打电话:

currEnemy.heatlh =  currPlayer.charAttack(currEnemy.health);