我只是在学习神经网络,我想让神经元的构造函数在阵列中的一个部分中收到一个指向染色体的部分。这样的事情:

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中执行所有操作吗?在开始这样做之前,我应该意识到吗?以前从未在C#中使用不安全的代码。

有帮助吗?

解决方案

埃里克·利珀特(Eric Lippert) 有分为两部分的精美系列: 参考和指针,第一部分“托管指针”实现(参考和指针,第二部分).

当我将一些复杂的指针操作代码从C到C#翻译成一个方便的类型。它使您可以将安全的“托管指针”定为阵列的内部。您可以在非托管指针上获得所有可以执行的操作:您可以将其作为偏移量放入数组,进行加法和减法,比较两个指向平等或不平等的指针,并表示无效的指针。但是,与相应的不安全代码不同,此代码不会弄乱垃圾收集器,并且会断言您是否做愚蠢的事情,例如尝试比较两个内部与不同阵列的指针。 (*) 享受!

希望能帮助到你。

其他提示

听起来您可以使用 ArraySegment<int> 对于您要做的事情。

数组段是围绕数组的包装器,该数组划定了该数组中的一系列元素。多个数组段实例可以参考相同的原始数组,并且可以重叠。

数组属性返回整个原始数组,而不是数组的副本;因此,对数组属性返回的数组进行的更改是对原始数组进行的。

是的,这在C#中是完全可能的,尽管单独使用指针不足以以这种方式使用它,但您还需要一个INT32长度参数,因此您知道在没有超支的情况下可以安全地增加该指针的安全性。如果您来自C ++背景,这应该很熟悉。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top