3

私は .net で実行される言語用のコンパイラの作成に取り組んでおり、GetHashCode メソッドを自動的に生成することを望んでいますが、いくつか質問があります。

  • これは可能ですか?コンパイラは、メソッドを実装する合理的な仕事をするために、関与する型について十分に知っていますか?
  • 値型、参照型、またはその両方に対してこれを行う必要がありますか?
  • null プロパティなどのサポートを含む、コンパイラが生成する合理的な GetHashCode アルゴリズムは何ですか?
  • これは、私が見ることができる別の言語/コンパイラで行われましたか?
  • これが不可能である、または本当に悪い考えである場合、その理由は何ですか?

ありがとう

4

1 に答える 1

2

C# コンパイラが匿名型に対して行うことを確認してください。基本的には、私が自分で書くのと同じ種類のハッシュです:

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

(もちろん、無効チェックも必要です。)

不変型に対してこれを行う(および等価オーバーライドを行う)のは良い考えだと思いますが、一般的に可変型に対してはそうではありません。いずれにせよ、値型はほとんど常に不変であるべきです - 参照型はどちらの方向にも行くことができます。あなたの言語には、不変性の概念が組み込まれていますか? もちろん、型が「浅い不変」であるが、オブジェクトの現在のGetHashCode状態を示すためにオーバーライドする可変型が含まれている場合、これはうまくいきません。そのようなタイプは一般的にとにかく痛いでしょう。

一般的には、等価コードとハッシュ コードを自動生成することは多くの場合合理的だと思います。実際、名前付き型についてもこれを C# 5 の一部にしたいと考えています。それ以外の場合は同じ機能を持つ型に名前を付ける簡単な方法が必要です。匿名型として。

于 2010-07-01T18:30:04.697 に答える