CesatAGS Ответов: 1

Как использовать указатель в C# , как C++


Привет, ребята, у меня есть эти структуры в c++, и я хочу преобразовать их в c#, как я могу кодировать более близко в c#?
template<typename T>
	struct pares
	{
		DWORD64 first;
		T* second;
	};
	template<typename T>
	struct hash_node
	{
		pares<T> mValue;
		hash_node<T>* mpNext;
	};

	template<typename T>
	struct hashtable
	{
		DWORD64 vtable;
		hash_node<T>** mpBucketArray;
		unsigned int mnBucketCount;
		unsigned int mnElementCount;
		//...
	};

	template<typename T>
	struct hashtable_iterator
	{
		hash_node<T>* mpNode;
		hash_node<T>** mpBucket;
	};


Что я уже пробовал:

[StructLayout(LayoutKind.Sequential)]
    public unsafe struct pair<T>
    {

        public Int64 first;
        public  T second;
    }

    public class hash_node<T>
    {
        public pair<T> mValue = new pair<T>();
        public hash_node<T> mpNext;
    }

    public class hashtable<T>
    {
        public Int64 vtable;
        public hash_node<T>[] mpBucketArray;
        public int mnBucketCount;
        public int mnElementCount;
    }
    public class hashtable_iterator<T>
    {
        public hash_node<T> mpNode;
        public hash_node<T> mpBucket;
    }

1 Ответов

Рейтинг:
0

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[^]


CesatAGS

thx у меня просто есть проблема с этой моделью

шаблон<typename T>
структура hash_node
{
pares<t> mValue;
hash_node<t>* mpNext;
};

мой пытался с#
hash_node структура&ЛТ;п&ГТ;
{
пара<t> mValue;
hash_node<t> mpNext;// получить ошибку на этом. hash_node<t>.mpNext' типа 'Program.hash_node<t>' вызывает цикл в макете структуры
}

Afzaal Ahmad Zeeshan

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

Видеть здесь на так.