当方法返回相同类型的对象时,参数对象也会更改

时间:2016-03-28 07:38:15

标签: c# oop

请帮我解决这个问题

我创建了一个对象Node

public Node(HashSet<string> _id, double _weight, List<string> _diff, int _depth, HashSet<string> _prefix, int _support)
{
    Id = _id;
    Weight = _weight;
    Diffset = _diff;
    Depth = _depth;
    Prefix = _prefix;
    Support = _support;
    Isleaf = false;
    Weightsup = _support*_weight;
}

我创建了一个这样的方法并传递三个参数

public Node CreateTailNode(Node _a, Node _b, Double _minsup)
{
    Node _child = new Node();
    _child.Prefix = _a.Id;
    _child.Id = _a.Id.AddRange(_b.Id);
    _child.Depth = _a.Depth + 1;
    _child.Diffset = _a.Diffset.Except(_b.Diffset).ToList();
    _child.Weight = (_a.Weight + _b.Weight)/2;
    _child.Support = _a.Support - _child.Diffset.Count;
    _child.Weightsup = _child.Support*_child.Weight;
    if (_child.Weightsup < _minsup)
    {
        _child.Isleaf = true;
    }
    else
    {
        _child.Isleaf = false;
    }
    return _child;
}

返回_child之后我意识到Node _a.Prefix也发生了变化并且来到了同一个_child.Prefix

如何在没有Node _a

的更改前缀的情况下创建_child

2 个答案:

答案 0 :(得分:0)

这里的问题是HashSet是没有值语义的引用类型,因此复制引用不会创建内容的新副本;引用副本最终引用原始对象。

解决方案是在分配之前制作HashSet的副本。

_child.Prefix = new HashSet<string>(_a.Id);

我不确定你对_child.Id的意图是什么,但我希望你不得不做类似的事情:

_child.Id = new HashSet<string>(_a.Id);
_child.Id.AddRange(_b.Id);

同样的逻辑必须适用于您可能正在使用的任何其他引用类型;如果你需要一份单独的副本,你必须明确地制作一份。

答案 1 :(得分:0)

我需要将if()条件中的两个HashSet与if(_F1.Prefix == _F2.Prefix) {Do sth. here}进行比较但结果始终为false。