关于C#中实例和对象字典的问题

时间:2011-06-20 04:47:37

标签: c# dictionary instance

您好我已经构建了一个简单的数据包框架,其中每个数据包都是一个类文件,它扩展了一个接口,但是不重要的只是一点介绍,告诉您它是如何工作的以及我正在尝试做什么。

说它是这样的

public static void HandlePacket(Player player, Packet p)
{
    PacketHandler handler = null;

    if(handlers.TryGetValue(p.getId(), out handler)) {
        handler.handlePacket(player, p);  
    } else {
        Console.WriteLine("Unhandled packet: " + p + ".");
    }
}

但是上面的代码与这个问题有点无关......我的问题与以最有效的方式填充处理程序有关。

处理程序几乎就是

private static Dictionary<int, PacketHandler> handlers = new Dictionary<int, PacketHandler>();

现在我无法决定填充处理程序地图的方法。

丑陋的第一种方式是这样的。

PacketHandler temp;
temp = new TalkPacket();
handlers.Add(33, temp);
handlers.Add(66, temp);
handlers.Add(22, temp);
handlers.Add(11, temp);

优雅的方式看起来像这样。

handlers.Add(33, new TalkPacket());
handlers.Add(66, new TalkPacket());
handlers.Add(22, new TalkPacket());
handlers.Add(11, new TalkPacket());

我的问题是关于为什么要创建更多对象的引用...当你可以重用它们时。

所以我真的不确定丑陋的方式只能制作一个TalkPacket对象的实例还是4个?喜欢优雅的方式,如果与上面的代码没有区别。然后我不妨用优雅的方式去。

我只会包含不超过255个数据包,所以255个对象大不了..但是大多数数据包将与其他操作码共享,这就是为什么我一直在想为什么当他们做同样的事情时会发起更多实例。< / p>

首先,我正在寻找一种方法将多个int数据类型绑定到一个对象,并且像 TryGetValue 命令一样轻松访问。

无论如何,如果有人有任何好的建议,请告诉我。感谢。

2 个答案:

答案 0 :(得分:1)

第一种方法是只创建了一个TalkPacket实例,并且Dictionary中的所有4个条目都引用了这个单个实例。

在第二个中,有4个不同类型的TalkPacket对象。

所以不,这两个不等同。

答案 1 :(得分:0)

您不需要字典:

在你做的字典上:

PacketHandler temp;
temp = new TalkPacket();
handlers.Add(33, temp);
handlers.Add(66, temp);
handlers.Add(22, temp);
handlers.Add(11, temp);

与:

相同
private static PacketHandler handler = new TalkPacket();
public static void HandlePacket(Player player, Packet p)
{
    PacketHandler handler = null;

    if(idList.Contains(p.Id)) { // no need for dictionary, just array or list of int
        handler.handlePacket(player, p);  
    } else {
        Console.WriteLine("Unhandled packet: " + p + ".");
    }
}

虽然您提出的第二种方法与:

相同
public static void HandlePacket(Player player, Packet p)
{
    PacketHandler handler = null;

    if(idList.Contains(p.Id)) { // no need for dictionary, just array or list of int
        handler = new TalkPacket();
        handler.HandlePacket(player, p);  
    } else {
        Console.WriteLine("Unhandled packet: " + p + ".");
    }
}

第二种方法较慢。