“复合”变量类型的正确实现是什么?

时间:2011-04-01 14:14:32

标签: c# variables c#-4.0

我有一个程序必须使用复合键管理对象。 这个关键,简单就是几个字符串。

我有以下代码:

public struct MyKey
{
    public string Part1 { get; set;} // always set
    public string Part2 { get; set;} // can be null
    public MyKey(string part1, string part2) : this()
    {
        this.Part1 = part1;
        this.Part2 = part2;
    }
}

这可以存储我的值。

现在我希望能够:

  • 使用equals运算符(part1和part2等于)
  • 在词典中使用键,尤其是使用包含方法

我猜测了很多事情(覆盖等于运算符,重写GetHashCode和Equals方法,实现IComparable等),但我不确定实现目标的必要步骤是什么,以及什么会导致开销

事先提前

3 个答案:

答案 0 :(得分:6)

使用.NET 4.0 Tuple,它具有基于组件值的正确的Equals()GetHashCode()。我之前使用过Tuple,或者如果它们是字符串键,你总是可以用分隔符连接,但是如果你真的想把这个类作为你的键,你需要一个合适的Equals()和GetHashCode(),所以在这种情况下YourType实现IEqualityComparer<YourType>

P.S。这是一个覆盖GetHashCode()的好例子,如果你想手动而不是元组...

What is the best algorithm for an overridden System.Object.GetHashCode?

答案 1 :(得分:1)

您需要覆盖EqualsGetHashCode才能将对象用作字典中的键。这个answer提供了很好的解释。

答案 2 :(得分:0)

首先,由于拳击,我会远离struct以及它可能导致的各种编码陷阱。

我会覆盖GetHashCodeEqualsGetHashCode因为它被用在字典和Equals中,因为它被各种ORM使用,并且可以方便地实现业务逻辑。