隐藏房产(C#)

时间:2013-01-19 08:32:15

标签: c# .net

我有以下课程:

  • 玩家经理(添加玩家,删除等)
  • 玩家(它可以做各种事情)
  • 客户端(它包含网络操作,如发送数据,recv等)。

播放器管理器有一个Player类数组,Client类是Player的组合,具有私有访问权限,因为我不需要用户看到客户端界面。

一切都很好,除了我想使用数组固定长度而不是列表的问题。 客户端类是在运行时确定的,如果我想初始化一个播放器,我需要直接在属性上设置它或使用setter方法,这迫使我将客户端组合设置为公共。

List在这个问题上运行得非常好,因为我可以在Player类的构造函数上设置Client属性,但是想法是使用数组固定长度,因为它更快。是否有任何工作要将Client保持为私有并将其设置为Player Manager类?

public class PlayerManager
{
    public Player[] players { get; set; }

    public PlayerManager(int maxplayers)
    {
        players = new Player[maxplayers];
    }

    public void Add(Client client)
    {
        Player player = FindPlayerSlot();
        player.client = client; //cant do this, client is private property
    }

}

public class Player
{
     private Client client { get; set; } //Need to hide this from user

     //I can set a constructor here for set the client property, but this would
     //force me to use a list.
}

2 个答案:

答案 0 :(得分:1)

尝试将其设为internal属性。 internal关键字使得类型或成员在其定义的程序集之外不可见。

假设这一切都在一个程序集中,用户将引用您的程序集并使用它。如果您有多个程序集需要内部可见,则可以使用[assembly: InternalsVisibleTo("MyOtherAssembly")]来定义唯一可以访问标记为内部成员的其他程序集。

此外,List<Client>不会比固定数组慢,除非它正在调整大小。如果使用List constructor with an initial capacity,则可以获得与固定数组相同的性能。

答案 1 :(得分:0)

为什么不让

FindPlayerSlot(); // return a int type ?

并通过构造函数设置客户端属性?

int playerid = FindPlayerSlot();
if (playerid > -1)
{
    Player player = new Player(client);
}

添加构造函数

公共类播放器 {      私人客户客户{get;组; } //需要隐藏此用户

 //I can set a constructor here for set the client property, but this would
 //force me to use a list.
public Player(Client client)
{
    this.client = client;
}

}