Afzaal Ahmad Zeeshan
Если вы хотите использовать C# потому что, то вы должны оставить всю эту роскошь указателя с C++. Основная концепция C# заключалась в создании управляемой среды, в которой вам нужно было только написать бизнес-логику, а не управлять низкоуровневой памятью и аппаратным обеспечением. Сам C# достаточно хорош, чтобы управлять ссылками для вас, очищать их, передавать ссылки по значению.
Теперь в вашем коде C++ у вас есть 4 типа структур, а в C# у вас есть только одна структура. Даже в этом случае вы неправильно использовали unsafe
масштаб. Это не то, что означает небезопасный контекст, это означает, что вы можете непосредственно использовать собственные указатели там, и вы несете ответственность за саму область действия. В то время как вы пытаетесь использовать управляемый указатель-содержащий тип там—IntPtr
. IntPtr
это не то, что имеет C++ в качестве int*
, и чтобы понять это, требуется, чтобы вы поняли, почему управляемые языки были когда-либо созданы.
Кроме этого случая, ваш код никоим образом не идентичен C++. Структура в C++ должна быть заменена на структуру в C#. Хотя понятия типа значения и ссылочного типа обширны по сравнению с типом значения и ссылочным типом В C#, но давайте на некоторое время проигнорируем этот факт. Если вы хотите использовать C++ в .NET framework, то рассмотрите .Реализация NET на C++, даже в этом случае вы должны предпочесть управляемую ссылку (^ оператор[^]), а не родные указатели.
Просто в качестве общего случая позвольте мне рассказать вам, как вы можете переписать код C++ на C#,
template<typename T>
struct hashtable_iterator
{
hash_node<T>* mpNode;
hash_node<T>** mpBucket;
};
Это можно переписать на этот,
struct hashtable_iterator<T> {
hash_node<T> mpNode;
List<hash_node<T>> mpBucket;
}
В приведенном выше коде вы сначала игнорируете тот факт, что вам требуется иметь указатель там. Сама среда выполнения заботится о передаче типов по ссылке, а не о копировании—вот что означает ваш указатель. Второй член-это указатель на указатель, мы можем использовать
List<T>
или
array[]
- это зависит от вашего варианта использования. Вы можете добавить дополнительную плату
List<T>
, если ваша цель указателя состояла в том, чтобы составить список—что маловероятно, как предполагают имена ваших членов.
Необязательный совет: Вы также должны рассмотреть возможность использования интеллектуальных указателей в вашем коде C++!
Пожалуйста, смотрите эти ссылки,
c++ cli - IntPtr vs указатели C++ - переполнение стека[
^]
Метод IntPtr.Add(IntPtr, Int32) (Система) | Microsoft Docs[
^]
Интеллектуальные Указатели (Современный C++) | Microsoft Docs[
^]
Afzaal Ahmad Zeeshan
В основном это происходит потому, что структуры не похожи на ссылочные типы, их размеры должны быть вычислены для макета, а это означает, что члены структуры также должны быть вычислены, и это рекурсивный цикл, никогда не заканчивающийся. Вот почему не рекомендуется содержать структуру внутри структуры. Для самодостаточных рассмотрим классы.
Видеть здесь на так.