C# 如何更改类变量?

C# 如何更改类变量?,c#,class,variables,scope,C#,Class,Variables,Scope,我在一个非常基本的C#控制台游戏(文本冒险)中有一个类,我想在代码的其他地方修改一个变量。我知道C#不允许全局变量,但这基本上就是我想要的 我是编程的初学者。我被难住了,我一直找不到这个问题的答案。这确实是我所追求的范围问题;哪些变量可以相互“交谈”。下面我将包括一个简单的例子 类中的所有这些字段都将 可以在各种方法中的其他地方进行修改 class Player { public int health = 100; public string armor = "n

我在一个非常基本的C#控制台游戏(文本冒险)中有一个类,我想在代码的其他地方修改一个变量。我知道C#不允许全局变量,但这基本上就是我想要的

我是编程的初学者。我被难住了,我一直找不到这个问题的答案。这确实是我所追求的范围问题;哪些变量可以相互“交谈”。下面我将包括一个简单的例子

类中的所有这些字段都将 可以在各种方法中的其他地方进行修改

class Player        
{
    public int health = 100;
    public string armor = "none";
    public string gun = "none";
    public int money = 1000;
}

    public static void AddMoney()
{
    var NewPlayer = new Player();
    NewPlayer.money += 1500;
}

所以我想知道如果全局变量在C#中不是一个东西,我应该怎么做。免责声明:你可以把
Player
变成一个
static
类,它可能会按照你想要的方式运行,但这样做是不明智的,因为它将你限制在一个Player对象上,并且不容易进行单元测试,除其他问题外。看

你必须明白你的
Player
是一个职业。将其视为
播放器
对象外观的蓝图。我通常用汽车来比喻:你买两辆丰田普锐斯。各方面都一样。你带一个去喷漆店,在上面画一个图案。另一辆普锐斯换了吗?不,与
var player1=new Player()相同;var player2=新玩家()-他们都是“玩家”类型,但他们不是同一个玩家

现在考虑你的加币方法:< /P>
public static void AddMoney()
{
    var NewPlayer = new Player();
    NewPlayer.money += 1500;
}
您正在创建一个仅存在于
AddMoney
方法中的播放器。一旦出了门,它实际上就不存在了(东西不会立即从内存中删除,但现在还不是你应该关注的话题)

由于
Player
是一个
,因此它是一个,这意味着将它传递给方法将传递对内存中相同对象的引用。这意味着我们可以在
AddMoney
中更改对象,它将反映在调用者中。请注意,我们不能替换对象,因为您需要(但这也是另一个主题)

例如:

var player = new Player();
player.money = 8500;
Console.WriteLine(player.money); // 8 500
AddMoney(player);
Console.WriteLine(player.money); // 10 000

或者,如果要创建播放器,可以创建工厂方法:

public static Player CreatePlayer()
{
    return new Player
    {
        money = 1500
    };
}

免责声明:您可以使
Player
成为
static
类,该类可能会按照您的意愿运行,但这样做是不明智的,因为它将您限制为单个Player对象,并且不容易进行单元测试,以及其他问题。看

你必须明白你的
Player
是一个职业。将其视为
播放器
对象外观的蓝图。我通常用汽车来比喻:你买两辆丰田普锐斯。各方面都一样。你带一个去喷漆店,在上面画一个图案。另一辆普锐斯换了吗?不,与
var player1=new Player()相同;var player2=新玩家()-他们都是“玩家”类型,但他们不是同一个玩家

现在考虑你的加币方法:< /P>
public static void AddMoney()
{
    var NewPlayer = new Player();
    NewPlayer.money += 1500;
}
您正在创建一个仅存在于
AddMoney
方法中的播放器。一旦出了门,它实际上就不存在了(东西不会立即从内存中删除,但现在还不是你应该关注的话题)

由于
Player
是一个
,因此它是一个,这意味着将它传递给方法将传递对内存中相同对象的引用。这意味着我们可以在
AddMoney
中更改对象,它将反映在调用者中。请注意,我们不能替换对象,因为您需要(但这也是另一个主题)

例如:

var player = new Player();
player.money = 8500;
Console.WriteLine(player.money); // 8 500
AddMoney(player);
Console.WriteLine(player.money); // 10 000

或者,如果要创建播放器,可以创建工厂方法:

public static Player CreatePlayer()
{
    return new Player
    {
        money = 1500
    };
}

有几种方法可以更新C#中的实例变量:使用Java或实例方法中的或setter。下面的代码向您展示了其中的一些

最终,您要做的是将对播放器实例的引用传递给不同的方法,并让它们使用属性/方法来更新实例变量:

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var p1 = new Player();

            p1.Health = 5000;
            p1.Armor = "Helmet";
            p1.AddMoney(200);

            Console.WriteLine($"Health: { p1.Health }");

            var enemy = new Enemy();

            enemy.Shoot(p1);

            Console.WriteLine($"Health after being shot: {p1.Health}");
        }
    }

    class Player
    {
        private string armor;
        private int money;

        public int Health { get; set; }

        public string Armor
        {
            get => armor;
            set
            {
                Console.WriteLine("Updating armor.");
                armor = value;
            }
        }

        public int Money { get; private set; }

        public void AddMoney(int money)
        {
            // More complex logic here, example: synchronization.
            this.money = money;
        }
    }

    class Enemy
    {
        public void Shoot(Player p)
        {
            p.Health -= 500;
        }
    }
}
这是一种面向对象的做事方式。对于应用程序范围变量意义上的全局变量,您可以参考


您还可以将
播放器设置为一个。这更像是一种设计选择,而不是实际的C#东西。我不打算在这里讨论单例模式。如果你搜索单例及其优缺点,你会听到很多:)

在C#中有几种更新实例变量的方法:使用或设置器,如Java或实例方法。下面的代码向您展示了其中的一些

最终,您要做的是将对播放器实例的引用传递给不同的方法,并让它们使用属性/方法来更新实例变量:

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var p1 = new Player();

            p1.Health = 5000;
            p1.Armor = "Helmet";
            p1.AddMoney(200);

            Console.WriteLine($"Health: { p1.Health }");

            var enemy = new Enemy();

            enemy.Shoot(p1);

            Console.WriteLine($"Health after being shot: {p1.Health}");
        }
    }

    class Player
    {
        private string armor;
        private int money;

        public int Health { get; set; }

        public string Armor
        {
            get => armor;
            set
            {
                Console.WriteLine("Updating armor.");
                armor = value;
            }
        }

        public int Money { get; private set; }

        public void AddMoney(int money)
        {
            // More complex logic here, example: synchronization.
            this.money = money;
        }
    }

    class Enemy
    {
        public void Shoot(Player p)
        {
            p.Health -= 500;
        }
    }
}
这是一种面向对象的做事方式。对于应用程序范围变量意义上的全局变量,您可以参考


您还可以将
播放器设置为一个。这更像是一种设计选择,而不是实际的C#东西。我不打算在这里讨论单例模式。如果你搜索单身人士及其优缺点,你会听到很多:)

好吧,你证明了你确实能够使用
NewPlayer.money
更改公共(也称为全局)变量。那有什么问题?您正在寻找成员实现吗?字段变量不应该是公共的。让它们成为属性。我建议你仔细阅读关于类构造函数的内容,用你自己的话来说,什么是类?什么是物体?您对其工作原理的现有理解是什么?您展示了您确实能够使用
NewPlayer.money
更改公共(也称为全局)变量。那有什么问题?您正在寻找成员实现吗?字段变量不应该是公共的。让它们成为属性。我建议你仔细阅读关于类构造函数的内容,用你自己的话来说,什么是类?什么是物体?你对这项工作的现有理解是什么?