Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#结构/类/列表索引_C#_List_Class_Struct_Indexing - Fatal编程技术网

C#结构/类/列表索引

C#结构/类/列表索引,c#,list,class,struct,indexing,C#,List,Class,Struct,Indexing,我目前正在学习C#,我被要求制作一个类似C上的垄断和C#上的另一个版本的游戏。但是在C上有一些东西我并不真正理解,主要是因为它是一种面向对象的语言。所以问题是,为了管理玩家,我在C版本上创建了一个结构 typedef struct regist { int number; char name[50]; int money; int position; int inGame; } Player; Player players[8]; 要获取结构的任何数据,我只需执行以下操作: players[

我目前正在学习C#,我被要求制作一个类似C上的垄断和C#上的另一个版本的游戏。但是在C上有一些东西我并不真正理解,主要是因为它是一种面向对象的语言。所以问题是,为了管理玩家,我在C版本上创建了一个结构

typedef struct regist
{
int number;
char name[50];
int money;
int position;
int inGame;
} Player;

Player players[8];
要获取结构的任何数据,我只需执行以下操作:

players[5].name = "Joe";
现在,我的C#问题是我设法创建了“struct”。首先,我创建了一个结构。然后我尝试用一个结构列表来创建它。然后我决定为每个玩家创建一个新的类实例。有人告诉我这是最好的方法,所以我就这么做了。所以我在我的玩家课上:

public class Players
{
 int number;
 string name;
 int money;
 int position;
 bool inGame;
 }
在我的表格1上:

私有void newGameButton_单击(对象发送者,事件参数e) { setNames(); getNames(); }

    public void setNames()
    {
        Players player1 = new Players();
        player1.name= textBox1.Text;
        Players player2 = new Players();
        player2.name = textBox2.Text;
        Players player3 = new Players();
        player3.name = textBox3.Text;
        Players player4 = new Players();
        player4.name = textBox4.Text;
    }
现在我不知道怎么做:

    public string getNames(){
        return Players[2].name;
    }
我怎样才能做到这一点?我也尝试过列表,但它不允许我以我想要的方式来做,而且,我希望能够在其他类中使用相同的实例,我希望这是可能的。。。
谢谢。

一旦你有了一个
列表,你就需要将你的intances添加到列表中。然后你就可以按预期编制索引了:

private List<Players> allPlayers = new List<Players>();

public void setNames()
{
    Players player1 = new Players();
    player1.name= textBox1.Text;
    Players player2 = new Players();
    player2.name = textBox2.Text;
    Players player3 = new Players();
    player3.name = textBox3.Text;
    Players player4 = new Players();
    player4.name = textBox4.Text;

    allPlayers.Add(player1);
    allPlayers.Add(player2);
    allPlayers.Add(player3);
    allPlayers.Add(player4);
}
private List allPlayers=new List();
public void setNames()
{
玩家玩家1=新玩家();
player1.name=textBox1.Text;
Players player2=新玩家();
player2.name=textBox2.Text;
Players player3=新玩家();
player3.name=textBox3.Text;
Players player4=新玩家();
player4.name=textBox4.Text;
添加(player1);
添加(player2);
添加(player3);
所有玩家。添加(玩家4);
}
现在,您可以通过
allPlayers[2]
或其他代码中的任何其他索引来访问它


一个样式说明,你的类应该命名为
Player
而不是
Players
Player
是一个对象,
Players
表示
Player
对象的集合属性。

在创建类使用属性时

public class Players
{
    public int number{get;set;}
    public string name{get;set;}
    public int money{get;set;}
    public int position { get; set; }
    public bool inGame { get; set; }

    public string getNames(){
    return name;
    }
}
在创建其对象时

public  Players[] p = new Players[5];
任务可以完成

p[0].name = textBox1.Text;
p[1].name = textBox2.Text;
p[2].name = textBox3.Text;
p[3].name = textBox4.Text;
p[4].name = textBox5.Text;
现在,如果可以从对象p的任何位置访问,那么您肯定可以

 p[2].getNames();
这样做

使用列表

List<Players> pList = new List<Players>();
Players p1 = new Players();
p1.name="abc";
pList.add(p1);
Players p2 = new Players();
p2.name="xyz";
pList.add(p2);

尝试使用列表时出现了什么问题?不要使用
char
数组。请显示您尝试使用列表的内容。因为这是最好的方法之一。顺便说一下,您的最后一个代码段将无法工作,因为字符数组不是字符串,并且默认情况下您的字段是私有的?您正在创建一个好的类,并通过调用new operator创建它的多个实例,这也很好。但是,您的示例代码中有一点输入错误:player2.name。。。jogador2.name=textBox2.Text;同时将类名从Players改为Player,使其正确命名。@MPT您看过C#代码段了吗?您的类中有一个字符数组。所有这些领域都是私有的。是的,我明白了,谢谢你,但我的问题是,我如何才能让其他职业的所有玩家都这样做?我必须实例化代码所在类的新实例吗?@MPT不,您需要将
allPlayers
列表传递给该对象,要么在类的构造函数上,要么作为其中一个方法的参数。想必您知道参数是如何工作的,所以您的另一个类将有一个方法,比如构造函数,接受
列表
,即:
公共MyOtherClass(列表玩家)
。然后它可能会将引用存储在私有变量中,然后类方法可以访问该变量。对象在C#中始终作为引用(如指针)传递,因此您的变量和其他类变量都将指向同一对象。@MPT没问题,很高兴提供帮助!当我使用返回时,它会说“索引超出范围”,但如果我放置messageBox.Show,它可以正常工作,为什么?做一件事,在类中创建一个函数getName,并使用p[2].getName()调用;希望这能解决您的问题。数组从索引0开始,您可能需要修复它。
public string getNames(){
return pList[0].name;
}