Передайте указатель в раздел массива в качестве параметра в C#

StackOverflow https://stackoverflow.com/questions/5805846

  •  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 ++.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top