Rx Observable для типов значений

У меня есть API, получающий сообщения в виде структур в методе обратного вызова.

void OnReceive(ref T message)

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

Учитывая, что я не могу сделать наблюдаемые ссылки на структуры и что структуры передаются/возвращаются путем создания копии этого решения

Observable<T> GetItems() //where T is struct

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

Насколько велики ваши структуры? Обычно структуры должны быть небольшими объектами с небольшим объемом данных. Вместо этого более крупные структуры данных следует моделировать как классы. Другими словами, мое первоначальное ощущение состоит в том, что вы обеспокоены преждевременной оптимизацией или вам следует изменить дизайн и вместо этого использовать класс.

Enrico Massone 04.01.2023 20:42

Смотрите здесь чтобы узнать больше об этом

Enrico Massone 04.01.2023 20:44

@EnricoMassone, выбор использования структур был продиктован базовым API, который имеет дело с «неуправляемой» сериализацией более низкого уровня. Эти структуры имеют 20-30 полей, поэтому их размер слишком значителен, чтобы его игнорировать. Написание класса DTO кажется излишним.

ddv 05.01.2023 00:37

Просто чтобы лучше понять вашу точку зрения, главная проблема, которую вы сейчас беспокоите, заключается в том, что, создавая наблюдаемую последовательность, вы в конечном итоге копируете экземпляры структуры? Правильно ли я понимаю?

Enrico Massone 05.01.2023 08:39

@EnricoMassone, правильно. Проблема заключается в том, что каждый обратный вызов «выбрать», «где» и «подписаться» в конечном итоге приведет к многократному копированию структур для каждого сообщения.

ddv 05.01.2023 13:27

Не могли бы вы просто обернуть тип значения в класс и передать наблюдаемому объекту класс? Примерно так: public class Ref<T> where T : struct { public T Value { get; init; } }. Тогда у вас есть только одна копия, и после этого вы просто копируете ссылку.

Enigmativity 09.01.2023 02:58

@ddv - Пожалуйста, ответьте на мой комментарий выше.

Enigmativity 15.01.2023 06:20

да, я думаю, что это очень жизнеспособное решение здесь. Спасибо @Enigmativity

ddv 17.01.2023 20:24

Только профилирование кода может подтвердить или опровергнуть любую гипотезу относительно производительности. Давая рекомендацию, используйте структуру только в том случае, если «Ее размер экземпляра меньше 16 байт» звучит так, как будто мы выполняем на процессоре 8085 и примерно в то же время. :) Возможно, вы захотите профилировать SomeClass<T> и структуру T, включая отслеживание побочных эффектов сборщика мусора. Могу поспорить, это все равно не будет иметь значения - учитывая, что вы все равно загружаете данные из API, что может рассчитывать на 99,99% производительности.

CouchDeveloper 27.01.2023 09:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете просто обернуть тип значения в класс и передать наблюдаемому объекту класс.

Что-то вроде этого:

public class Ref<T> where T : struct { public T Value { get; init; } }

Другие вопросы по теме