У меня есть различные классы, которые обертывают . Они не хранят свои собственные данные (кроме указателя), но вместо этого используют свойства и методы для отображения данных по указателю с использованием неуправляемой библиотеки. Он работает хорошо, но я дошел до того, что мне нужно иметь возможность ссылаться на эти объекты-обертки из других объектов-оберток. Например:Как я могу избежать создания новых объектов-оберток повсюду?
public class Node {
private IntPtr _ptr;
public Node Parent {
get { return new Node(UnmanagedApi.GetParent(_ptr)); }
}
internal Node(IntPtr ptr) {
_ptr = ptr;
}
}
Теперь я могу просто возвращать new Node(parentPtr)
(как указано выше), но есть потенциал, имеющий десятки тысяч узлов. Разве это не будет плохой идеей, поскольку несколько объектов-оберток могут в конечном итоге ссылаться на тот же ?
Что можно сделать, чтобы исправить это? Я подумал об использовании статического класса KeyedCollection
, который использует каждый ключ . Поэтому, вместо того, чтобы возвращать новый Node
каждый раз, я могу просто посмотреть его. Но это вызовет проблемы с резьбой, верно?
Есть ли лучший способ?
Неуправляемая библиотека обрабатывает состояние. Мои классы просто придают ему представление. Однако я вижу, что вы говорите об удалении объектов. Они одноразовые, но потом я понял, что если они хранятся в «KeyValuePair», объекты все равно не будут собирать мусор. Меня беспокоит накладные расходы, связанные с тем, что тысячи объектов все делают в основном одно и то же. Было бы даже это заметно, или я просто пытаюсь оптимизировать ради оптимизации? C++/CLI не является вариантом, потому что я хочу позже переносить это в Mono. –
В целом создание тысяч объектов приведет к тому, что ваш сборщик мусора начнет головные боли. Другим вариантом может быть передача указателей и наличие вспомогательного класса, который принимает указатель и может возвращать требуемые данные. например Helper.GetIdFromUnmanagedObject (myPtr), а не оболочку указателя в объекте со своим поведением. Не так красиво в терминах OO, но по крайней мере у вас есть только неуправляемые объекты, а не обертки. – Paolo
Да, в основном у меня это уже (неуправляемый API построен в первую очередь так, как в первую очередь), но я действительно пытаюсь подключить его к фреймворку с помощью счетчиков и таким образом сделать его максимально интуитивным. Думаю, я просто подожду и посмотрю, как это получится, и решите статическую коллекцию ссылок, когда это действительно станет проблемой. Я посмотрел на него немного ближе, и вполне возможно, что объекты получат GC'd быстро, так как у них действительно нет ссылок на другие объекты (так как «IntPtrs» - это то, что фактически связывает их вместе). –