1

我有一个Team

public class Team
{
    public string Name { get; set; } = string.Empty;
    public IEnumerable<Player> Players { get; set; } = new List<Player>();
    
    public Team(string name, IEnumerable<Player> players)
    {
        Name = name;
        Players = players;
    }
    
    public void addPlayer(Player pl){
     // Players.Add(pl);
    }
}

如何正确创建将玩家添加到团队类的方法,例如:

 public void addPlayer(Player pl){
     // Players.Add(pl);
    }
4

3 回答 3

2

除非你真的需要一个可以公开设置的属性(即从你的班级之外),否则不要公开它。AnIEnumerable<T>是只读类型,不能向其添加元素。但是,您可以将元素添加到List<T>.

将您的自动属性转换为具有支持字段的属性,然后访问您的类中的字段,但使用该属性来公开阅读玩家:

public class Team
{
    private readonly List<Player> players;

    public string Name { get; }
    public IEnumerable<Player> Players => this.players;
    // older versions of C#: Players { get { return this.players; } }
    
    public Team(string name, List<Player> players)
    {
        this.Name = name;
        this.players = players;
    }
    
    public void addPlayer(Player pl) {
        this.players.Add(pl);
    }
}
于 2021-02-27T08:59:10.043 回答
2

您不能添加到,Players因为它是一个IEnumerable. 只能添加特定种类的IEnumerable,例如列表和集合。这是您的代码可以破坏的一种方式:我(您班级的用户)可以设置PlayerIEnumerable您无法添加内容的内容:

var team = new Team("My Team", new Player[] { });
team.AddPlayer(new Player(...));

现在Player是一个数组,你当然不能添加!

要允许向 中添加内容Players,您需要选择允许添加的类型。例如,ICollection<Player>IList<Player>List<Player>

public ICollection<Player> Players { get; set; }
public Team(string name, IEnumerable<Player> players)
    Name = name;
    Players = players.ToList();
}

// uncommenting the line in AddPlayer will now compile

你可以创建一个这种类型的私有字段,如果你愿意player,仍然可以公开一个。IEnumerable<Player>但是您需要删除设置器:

private List<Player> players;
public IEnumerable<Player> Players => players;
public Team(string name, IEnumerable<Player> players)
    Name = name;
    this.players = players.ToList();
}

public void addPlayer(Player pl){
    players.Add(pl);
}
于 2021-02-27T09:06:46.920 回答
1

您不能在 type 的对象中添加任何内容IEnumerable<T>。原因在于IEnumerable<T> 本质上

公开枚举器,它支持对指定类型的集合进行简单迭代。

你需要的是一个集合。可能是一个List<T>

例如

public class Team
{
    // Make essentially readonly these properties
    public string Name { get; }
    public List<Player> Players { get; }

    public Team(string name, List<Player> players)
    {
        if(String.IsNullOrWhiteSpace(name))
        {
            throw new ArgumentException($"{nameof(name)} cannot be null or empty");
        }
        Name = name;
    
        Players = player ?? throw new ArgumentNullException(nameof(players));
    }

    public void addPlayer(Player pl)
    {
        Players.Add(pl);
    }
}

注意:我还在构造函数中进行了一些检查,以便我们验证创建的对象是否处于一致状态(没有名称的团队,不会是团队)。

于 2021-02-27T08:57:55.317 回答