Статические классы в C#, каковы плюсы и минусы?

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

Вопрос в том, что я добавил монстров, предметы, стены, игрока и пули в статический класс с именем LiveObjects, после чего я могу получить доступ к этим объектам из любого места в коде. Это плохая практика? Какая альтернатива? (это не многопоточность)

LiveObjects.cs

internal static class LiveObjects
{        
    public static List<Item> items = new List<Item>(); // List with all the items
    public static List<Monster> monsters = new List<Monster>(); // List with all present monsters
    public static List<Wall> walls = new List<Wall>(); // List with the walls
    public static List<Bullet> bullets = new List<Bullet>(); // List with the bullets
    public static Player player = new Player(0, 0); // The player object
}

Я использую много разных классов для манипулирования данными внутри LiveObjects, а затем, чтобы избежать передачи всего списка, я могу просто вызывать его непосредственно внутри любого метода.


person Patrick    schedule 26.08.2009    source источник
comment
Это прекрасное решение, Патрик, в соответствии с в основном положительными отзывами ниже, но я бы обернул ваших публичных членов свойствами, а не выставлял их напрямую. Использование свойств даст вам некоторую гибкость в будущем, а также позволит вам легко использовать синхронизацию потоков для доступа к вашим объектам. Краткое руководство по свойствам: msdn.microsoft.com/en -us/library/aa288470(VS.71).aspx   -  person Paul Sasik    schedule 26.08.2009


Ответы (5)


Плюсы:

  • Легкий доступ
  • Простое кодирование

Минусы:

  • Нет безопасности потоков
  • Без инкапсуляции
  • Снижение ремонтопригодности
person DanDan    schedule 26.08.2009

Если ваше приложение является многопоточным, вам, возможно, придется подумать о проблемах, связанных с доступом нескольких потоков к статическим экземплярам и их изменением. Вот хорошая статья о многопоточности:

http://www.yoda.arachsys.com/csharp/threads/

person Charlie    schedule 26.08.2009

Одним из преимуществ статических классов является то, что это единственное место, где вы можете определить методы расширения.

person Brian Rasmussen    schedule 26.08.2009

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

Одним из минусов является то, что некоторые люди так ненавидят статические классы, что не возьмут вас на работу, потому что вы их использовали. http://thegrenade.blogspot.com/2009/01/static-methods-and-classes-are-always.html

person grenade    schedule 26.08.2009

Я думаю, что такое использование статического класса нормально, особенно в однопоточном приложении. Как уже говорили другие, ваша единственная альтернатива - передать какой-то контекстный объект, содержащий эти списки.

Мое личное мнение, в данном случае, что вы выбрали лучшее решение для вашей проблемы. Его легко внедрить, легко использовать и легко изменить, если возникнет необходимость в будущем.

person Andrew Hare    schedule 26.08.2009