Передайте указатель в раздел массива в качестве параметра в C#
-
24-10-2019 - |
Вопрос
Я просто изучаю нейронные сети, и я хотел бы, чтобы конструктор нейрона получил указатель на раздел в массиве, который будет хромосомой. Что-то вроде этого:
public int* ChromosomeSection;
public Neuron(int* chromosomeSection)
{
ChromosomeSection = chromosomeSection;
}
Итак, я бы создал свои нейроны с чем -то вроде этого:
int[] Chromosome = new int[neuronsCount * neuronDataSize];
for (int n = 0; n < Chromosome.Length; n += neuronDataSize)
{
AddNeuron(new Neuron(Chromosome + n));
}
Можно ли сделать это в C#? Я знаю, что C# поддерживает какой -то небезопасенный код. Но я не знаю, как сказать компилятору, что линия public Neuron(int* chromosomeSection)
небезопасно.
Кроме того, смогу ли я выполнять каждую операцию, которую я бы сделал в C ++ или C? Есть ли какой -нибудь Gotcha, о котором я должен знать, прежде чем начать делать это таким образом? Никогда не работал с небезопасным кодом в C# раньше.
Решение
Эрик Липперт Хорошая серия из двух частей: Ссылки и указатели, часть первая а также Реализация «Управляемые указатели» (ссылки и указатели, часть вторая).
Вот удобный тип I, когда я переводил какой-то сложный код манипуляции с указателем с C на C#. Это позволяет вам сделать безопасный «управляемый указатель» в интерьере массива. Вы получаете все операции, которые можете выполнить на неуправляемом указателе: вы можете определить его в качестве смещения в массив, сделать добавление и вычитание, сравнить два указателя для равенства или неравенства и представляют нулевый указатель. Но в отличие от соответствующего небезопасного кода, этот код не испортит сборщик мусора и будет утверждать, если вы сделаете что -то глупое, например, попытаться сравнить два указателя, которые являются внутренними с разными массивами. (*) Наслаждаться!
Надеюсь, поможет.
Другие советы
Похоже, вы могли бы использовать ArraySegment<int>
за то, что вы пытаетесь сделать.
Arraysement - это обертка вокруг массива, которая разграничивает диапазон элементов в этом массиве. Многочисленные экземпляры массива могут относиться к одному и тому же исходному массиву и могут перекрываться.
Свойство массива возвращает весь оригинальный массив, а не копию массива; Следовательно, изменения, внесенные в массив, возвращаемый имуществом массива, вносятся в первоначальный массив.
Да, это вполне возможно в C#, хотя только указатель на только недостаточно информации, чтобы использовать ее таким образом, вам также понадобится параметр длины Int32, поэтому вы знаете, сколько раз безопасно увеличить этот указатель без переполнения - Это должно быть знакомо, если вы из фона C ++.