将2个变量链接到一个对象

时间:2013-05-12 19:12:07

标签: c# class jagged-arrays

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;

2 个答案:

答案 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,它可能会按您期望的方式运作。