C# 如何更改类变量?
我在一个非常基本的C#控制台游戏(文本冒险)中有一个类,我想在代码的其他地方修改一个变量。我知道C#不允许全局变量,但这基本上就是我想要的 我是编程的初学者。我被难住了,我一直找不到这个问题的答案。这确实是我所追求的范围问题;哪些变量可以相互“交谈”。下面我将包括一个简单的例子 类中的所有这些字段都将 可以在各种方法中的其他地方进行修改C# 如何更改类变量?,c#,class,variables,scope,C#,Class,Variables,Scope,我在一个非常基本的C#控制台游戏(文本冒险)中有一个类,我想在代码的其他地方修改一个变量。我知道C#不允许全局变量,但这基本上就是我想要的 我是编程的初学者。我被难住了,我一直找不到这个问题的答案。这确实是我所追求的范围问题;哪些变量可以相互“交谈”。下面我将包括一个简单的例子 类中的所有这些字段都将 可以在各种方法中的其他地方进行修改 class Player { public int health = 100; public string armor = "n
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
更改公共(也称为全局)变量。那有什么问题?您正在寻找成员实现吗?字段变量不应该是公共的。让它们成为属性。我建议你仔细阅读关于类构造函数的内容,用你自己的话来说,什么是类?什么是物体?你对这项工作的现有理解是什么?