我正在努力编写一个在.NET上运行的语言的编译器,而我想做的一件事就是自动生成gethashcode方法,但是我有几个问题:

  • 这是否可能,编译器对所涉及的类型有足够的了解来实施该方法吗?
  • 我应该为价值类型,参考类型或两者兼而有之吗?
  • 编译器生成的合理Gethashcode算法是什么,其中包括对无效属性的支持等?
  • 这是用我可以看的另一种语言/编译器完成的吗?
  • 如果这是不可能的,或者是一个非常糟糕的主意,为什么?

谢谢

有帮助吗?

解决方案

看看C#编译器对匿名类型的作用。基本上,这是与我自己写的那种哈希:

public override int GetHashCode()
{
    int hash = 17;
    hash = 31 * hash + field1.GetHashCode();
    hash = 31 * hash + field2.GetHashCode();
    // etc
    return hash;
}

(当然,您还需要进行一些无效检查。)

我认为这样做是一个好主意 不是 对于可变类型。无论如何,价值类型几乎应该总是不可变的 - 参考类型可以采用任何一种方式。您的语言是否具有不变性的内置概念?当然,如果您的类型是“浅层不变”,但包含覆盖的可变类型,这将出错 GetHashCode 指示 当前的 对象的状态。无论如何,这种类型通常会很痛苦。

不过,总的来说,我认为在许多情况下自动化平等和哈希代码是合理的 - 的确,我希望这也是C#5的一部分:我想要一种简单的方法 命名 否则具有与匿名类型相同功能的类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top