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

在C#中更改方法中的几个变量,以便Main()识别,c#,non-static,C#,Non Static,我在Main中声明了两个变量,并在一个非静态方法中更改了这两个变量,该方法接收一些变量(包括我更改的两个),然后返回另一个变量,但在使用return()之后,Main无法识别对其他变量的更改;,并且这些值不断重置。如何使其识别这些更改 string Attack(int Mhp, int Chp, int Cdmg, int Mdmg, string charname) { string res; Mhp -= Cdmg; Chp

我在Main中声明了两个变量,并在一个非静态方法中更改了这两个变量,该方法接收一些变量(包括我更改的两个),然后返回另一个变量,但在使用return()之后,Main无法识别对其他变量的更改;,并且这些值不断重置。如何使其识别这些更改

    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()中声明的相同;,如果角色的健康状况不断重置,则使我的代码毫无意义

提前谢谢

使用

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

当您想在过程内部更改值类型时,必须通过引用传递它。这是C#琐事-阅读上面的内容:)

原语是通过值而不是引用传递给函数的。。。所以您正在更改变量的副本。。。“原始”从未看到更改…

Integer是一种值类型,它通过复制而不是引用传递给方法。您正在更改副本,而原始值保持不变。通过引用传递值类型,或者创建将保存整数值的引用类型
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

您必须明确引用它们:

int something = 5;
CallMethod(ref something);

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

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

现在这样做只会更改方法内部的值,而不会将这些更改反映到方法外部的变量。整数是值类型,这意味着它们将按值发送。您必须明确定义它们作为引用发送。

在我看来,最好在类中全局声明Mhp和Chp(或包含它们的结构/类)。 如果确实希望在main中声明它们,请使用ref关键字,以便程序将对main的var的引用传递给攻击函数,而不是包含在发出攻击调用时从它们获取的值的浅层副本

string Attack(ref int Mhp, ref int Chp, int Cdmg, int Mdmg, string charname)
注意,我建议的第一种方法要简单得多(声明类级变量),因为这样类的任何成员方法都可以直接(而不是通过引用)访问它们


干杯

旁注:长变量名没有坏处。参数通常以
camelCase
符号表示。
int something = 5;
CallMethod(ref something);

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

Console.WriteLine(something); // Output: 15
string Attack(ref int Mhp, ref int Chp, int Cdmg, int Mdmg, string charname)