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;
答案 0 :(得分: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。所有其他人保持不变。这就是结构与类不同的结果:它们是通过值复制而不是通过引用来分配的。
答案 1 :(得分:0)
这是因为struct
是值类型(与引用类型相对)并且具有值类型的复制语义。有关详细信息,请参阅此帖子:What is the difference between a reference type and value type in c#?。
如果您将theta
的类型更改为class
,它可能会按您期望的方式运作。