在 C# 中的 for 循环之外获取对象数据

WDU*_*DUK 0 c#

我对 C# 真的很陌生,我是从 Javascript 开始的,所以理解 C# 的行为有点困难。

我正在尝试在 for 循环内创建一个简单的对象,然后显示分配的值,但这存在范围问题,并且不清楚如何在 for 循环之外访问它?

这是我的代码设置:

public class Player{
    public int identity;
    public int score;

    public Player(int id){
        identity = id;
        score    = 0;
    }
}
for (int i = 0; i < max; i++){
        Player player = new Player(i);
}

//here i want to access a player and print the information for said player
Run Code Online (Sandbox Code Playgroud)

我不知道如何在循环之外访问新创建的玩家,这是如何完成的?

Cod*_*lla 5

我可以理解这在 JavaScript 中是如何令人困惑的,在 JavaScript 中,所有变量都被提升到函数(或全局)作用域。在 C# 中情况并非如此,在 C# 中,变量的作用域通常位于最近的{}s 集合内。但可在子范围内使用。

所以你可以这样写你的代码:

List<Player> players = new List<Player>();
Player player = null;
for (int i = 0; i < max; i++){
        player = new Player(i);
        players.Add(player);
}
Console.WriteLine(players[x]);
Run Code Online (Sandbox Code Playgroud)

在此示例中,您可以访问player之外的每个个体foreach,因为它是在更高的范围内声明的。但这样写会更合适:

List<Player> players = new List<Player>();
for (int i = 0; i < max; i++){
        Player player = new Player(i);
        players.Add(player);
}
Console.WriteLine(players[x]);
Run Code Online (Sandbox Code Playgroud)

通常认为,声明变量时尽可能接近其用法是一种良好的做法。

您自己建议的最后一个优化是player完全消除声明(因为它是不必要的)并将其内联。这给我们留下了最终版本:

List<Player> players = new List<Player>();
for (int i = 0; i < max; i++){
        players.Add(new Player(i));
}
Console.WriteLine(players[x]);
Run Code Online (Sandbox Code Playgroud)