Вопрос об экземплярах и словаре объектов в C # - PullRequest
0 голосов
/ 20 июня 2011

Здравствуйте, я создал простой пакетный скелет, в котором каждый пакет представляет собой файл класса, который расширяет интерфейс, но, что бы это ни было важно, просто небольшое вступление, чтобы показать вам, как оно работает и что я пытаюсь сделать.

скажем, что-то вроде этого

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 объектов имеют большое значение ... но большая часть пакетов будет использоваться совместно с другими кодами операций, поэтому я продолжаю думать, зачем инициировать больше экземпляров, когда они делают то же самое. 1023 *

Сначала я искал способ связать несколько типов данных int с одним объектом и иметь легкий доступ, например, команду TryGetValue .

В любом случае, если у кого-нибудь есть хорошие предложения, дайте мне знать. Спасибо.

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Первый способ - создание только одного экземпляра TalkPacket, и все 4 записи в Словаре ссылаются на этот единственный экземпляр.

Во втором есть 4 различных объекта типа TalkPacket.

Так что нет, эти два не эквивалентны.

0 голосов
/ 20 июня 2011

Вам не нужен словарь для этого:

в словаре, где вы делаете:

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 + ".");
    }
}

Второй подход медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...