От private readonly List<object> listeners = new(), стоит отказаться как минимум по причине неоднократной распаковки, из object в объект нужного нам типа, также прочитал некоторую оптимизацию использования операторов is и as, из книги Рихтера, вот выдержка из нее.
{
Для null-ссылок оператор is всегда возвращает false, так как объекта, тип
которого нужно проверить, не существует.
Обычно оператор is используется следующим образом:
if (o is Employee) {
Employee e = (Employee) o;
// Используем e внутри инструкции if
}
В этом коде CLR по сути проверяет тип объекта дважды: сначала в операторе
is определяется совместимость o с типом Employee, а затем в теле оператора if
анализируется, является ли o ссылкой на Employee. Контроль типов в CLR укре-
пляет безопасность, но при этом приходится жертвовать производительностью,
так как среда CLR должна выяснять фактический тип объекта, на который ссы-
лается переменная (o), а затем проверять всю иерархию наследования на предмет
наличия среди базовых типов заданного типа (Employee). Поскольку такая схема
встречается в программировании часто, в C# предложен механизм, повышающий
эффективность кода с помощью оператора as:
Employee e = o as Employee;
if (e != null) {
// Используем e внутри инструкции if
}
В этом коде CLR проверяет совместимость o с типом Employee. Если o и Employee
совместимы, as возвращает ненулевой указатель на этот объект, а если нет — опера-
Готовимся к куче доната и нереальной монетизации. Take two не даст игре иметь нормальную модель получения прибыли, что случилось с GTA ONLINE.
Вообще боль у нас на данном vpn завязано половина сервисом и подключения к удаленным устройствам((
От private readonly List<object> listeners = new(), стоит отказаться как минимум по причине неоднократной распаковки, из object в объект нужного нам типа, также прочитал некоторую оптимизацию использования операторов is и as, из книги Рихтера, вот выдержка из нее.
{
Для null-ссылок оператор is всегда возвращает false, так как объекта, тип
которого нужно проверить, не существует.
Обычно оператор is используется следующим образом:
if (o is Employee) {
Employee e = (Employee) o;
// Используем e внутри инструкции if
}
В этом коде CLR по сути проверяет тип объекта дважды: сначала в операторе
is определяется совместимость o с типом Employee, а затем в теле оператора if
анализируется, является ли o ссылкой на Employee. Контроль типов в CLR укре-
пляет безопасность, но при этом приходится жертвовать производительностью,
так как среда CLR должна выяснять фактический тип объекта, на который ссы-
лается переменная (o), а затем проверять всю иерархию наследования на предмет
наличия среди базовых типов заданного типа (Employee). Поскольку такая схема
встречается в программировании часто, в C# предложен механизм, повышающий
эффективность кода с помощью оператора as:
Employee e = o as Employee;
if (e != null) {
// Используем e внутри инструкции if
}
В этом коде CLR проверяет совместимость o с типом Employee. Если o и Employee
совместимы, as возвращает ненулевой указатель на этот объект, а если нет — опера-
тор as возвращает null.
}
Ох, это вы еще не работали с поддержкой Sony для PS4/PS5
Крайне интересная статья, хоть и не фанат палеонтологии, прочитал с большим удовольствием.