将指向数组部分的指针作为参数传递给C#

时间:2011-04-27 14:36:54

标签: c# unsafe unsafe-pointers

我只是在学习神经网络,我想让神经元的构造函数接收指向数组中可能是染色体的部分的指针。像这样:

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#支持一些不安全的代码。但我不知道如何告诉编译器行[{1}}是不安全的。

另外,我能够完成我在C ++或C中所做的每一项操作吗?在开始这样做之前有没有我应该知道的问题?从未使用过C#中的不安全代码。

3 个答案:

答案 0 :(得分:1)

听起来你可以使用ArraySegment<int>来做你想做的事情。

  

ArraySegment是一个包装器   一个分隔范围的数组   该数组中的元素。多   ArraySegment实例可以参考   相同的原始数组,可以   重叠。

     

Array属性返回整个   原始数组,不是副本   阵列;因此,改变了   Array属性返回的数组   是对原始数组。

答案 1 :(得分:1)

Eric Lippert有两个很好的系列:References and Pointers, Part One"managed pointers" implementation (References and Pointers, Part Two)

  

当我将一些复杂的指针操作代码从C语言转换为C#时,这是一个方便的类型。它允许您为数组内部创建一个安全的“托管指针”。您将获得对非托管指针可以执行的所有操作:您可以将其取消引用为数组的偏移量,执行加法和减法,比较两个指针以获得相等或不等,并表示空指针。但是与相应的不安全代码不同,这段代码不会搞乱垃圾收集器,如果你做了一些愚蠢的事情就会断言,比如尝试比较不同数组内部的两个指针。 (*)享受!

希望它有所帮助。

答案 2 :(得分:0)

是的,这在C#中是完全可能的,虽然单独指针不足以以这种方式使用它,你还需要一个Int32长度参数,所以你知道没有多少次增加指针是安全的超支 - 如果您来自C ++背景,这应该是熟悉的。