更改C#中方法中的几个变量以便Main()识别

时间:2013-11-22 14:15:04

标签: c# non-static

我在Main中声明了两个变量,并在一个非静态方法中更改了它们,这个方法接收了一些变量(包括我改变的两个变量)并返回另一个变量,但Main在使用后无法识别其他变量的变化return();,并且值保持重置。如何让它识别出变化?

    string Attack(int Mhp, int Chp, int Cdmg, int Mdmg, string charname)
    {
        string res;
        Mhp -= Cdmg;
        Chp -= Mdmg;
        Console.WriteLine();
        res=charname + "'s Health has been reduced to " + Chp +", and Monster's Health                reduced to " + Mhp;
        return(res);
    }

Mhp和Chp保持与我在Main()中声明的相同;如果角色的健康状况不断重置,我的代码将毫无意义。

提前致谢!

5 个答案:

答案 0 :(得分:7)

使用

string Attack(ref int Mhp, ref int Chp, int Cdmg, int Mdmg, string charname)

如果要在过程中更改值类型,则必须通过引用传递。这是C#琐事 - 读一些东西:)

答案 1 :(得分:2)

Integer是一个值类型,它通过复制传递给方法,而不是通过引用传递给方法。您正在更改副本和原始值保持不变。通过引用传递值类型,或创建将包含整数值的引用类型Character,并将字符传递给此方法。


public class Character
{
    private int health;
    public event Action<Character> HealthChanged;

    public Character(string name, int hp, int cdmg)
    {
        Name = name;
        health = hp;
        Damage = cdmg;
    }

    public string Name { get; private set; }
    public int Damage { get; private set; }
    public bool IsAlive { get { return Health > 0; } }

    public int Health 
    { 
        get { return health; }
        private set 
        {
            if (!IsAlive)
                return;

            health = value;

            if (HealthChanged != null)
               HealthChanged(this);
        }
    }

    public void Attack(Character target)
    {
        if (IsAlive)
            target.Health -= Damage;
    }
}

此课程有通知游戏核心关于角色健康变化的事件(考虑通知治疗也)。在Main中创建两个角色并订阅健康变化事件。然后开始战斗:

var character = new Character("Bob", 100, 70);
character.HealthChanged += CharacterHealthChanged;

var monster = new Character("Monster", 200, 10);
monster.HealthChanged += CharacterHealthChanged;

while (character.IsAlive && monster.IsAlive)
{
    character.Attack(monster);
    monster.Attack(character);
}

事件处理程序:

static void CharacterHealthChanged(Character characer)
{
    if (!characer.IsAlive)
        Console.WriteLine("{0} was killed", characer.Name);
    else
        Console.WriteLine("{0}'s health reduced to {1}", 
                                characer.Name, characer.Health);
}

输出

Monster's health reduced to 130
Bob's health reduced to 90
Monster's health reduced to 60
Bob's health reduced to 80
Monster is dead

答案 2 :(得分:1)

原语按值传递给函数,而不是通过引用...所以你要更改变量的副本......原始版本永远不会看到变化......

答案 3 :(得分:1)

你必须明确地引用它们:

int something = 5;
CallMethod(ref something);

private void CallMethod(ref int x) {
   x += 10;
}

Console.WriteLine(something); // Output: 15

您现在的方式只会更改方法中的值,但不会将这些更改反映到其外部的变量中。整数是值类型,这意味着它们将按值发送。您必须明确定义它们作为参考发送。

答案 4 :(得分:0)

在我看来,最好在类中全局声明Mhp和Chp(或包含它们的结构/类)。 如果你真的想在你的main中声明它们,那么使用ref关键字,这样程序就会将攻击函数传递给你的main的var的引用,而不是包含在调用时从它们获取的值的浅拷贝。袭击正在发布

string Attack(ref int Mhp, ref int Chp, int Cdmg, int Mdmg, string charname)

请注意,我建议的第一种方法更容易(声明类级别变量),因为这样,它们可以通过类的任何成员方法直接访问(而不是通过引用)。

干杯