4

Layers 是 Node 的锯齿状数组,每个节点作为 source[] 和 destination[] 代表 Theta 的数组。

问题是,为什么当我更改第四行的代码时,链接这些对象后第五行仍然打印“0”?

theta t = new theta();
layers[1][i].source[j] = t;
layers[0][j].destination[i] = t;
layers[0][j].destination[i].weight = 5;
Console.WriteLine(layers[1][i].source[j].weight);

struct theta
{
    public double weight;
    public theta(double _weight) { weight = _weight; }
}

class node
{
    public theta[] source;
    public theta[] destination;
    public double activation;
    public double delta;

    public node() { }
    public node(double x) { activation = x; }
}

关于如何填充图层的示例:

node n = new node();
n.destination = new theta[numberOfNodesPerHiddenLayer+1];
n.source = new theta[numberOfNodesPerHiddenLayer+1];
layers[i][j] = n;
4

2 回答 2

4

这是因为 Theta 是一个 STRUCT,而不是类。结构被隐式复制。当你在做:

theta t = new theta();
layers[1][i].source[j] = t;
layers[0][j].destination[i] = t;

你最终得到三个't'副本。一份原件,一份在索引 1,i 和一份在索引 0,j。然后,您仅将 5 分配给其中一个副本。所有其他保持不变。这就是结构与类的不同之处:它们是通过值复制分配的,而不是通过引用分配的。

于 2013-05-12T19:16:01.500 回答
0

那是因为struct它是一个值类型(与引用类型相反)并且具有值类型的复制语义。例如,请参阅这篇文章:c# 中的引用类型和值类型有什么区别?了解更多信息。

如果你改变它的类型,thetaclass可能会按照你期望的方式工作。

于 2013-05-12T19:16:09.643 回答