1

キャッシュキーを作成するためのToString()メソッドを使用するつもりです。このキャッシュは、メソッドレベルの呼び出しをキャッシュするために使用され、キーはパラメーター名と対応する値を使用して作成されます。このキャッシングは大規模なライブラリ用に構築されるため、すべてのメソッドに値型パラメーターのみがあること、またはすべてのクラスがシリアル化を実装していることを確認することはできません。実行時に、ToStringの呼び出しが型名に対して実際の値を返していることを確認して、メソッドの呼び出しがキャッシュへの参加を禁止できるようにする必要があります。

たとえば、次のメソッドとその呼び出しを検討してください

AccountDetails GetDetails(int groupId, Account account)
{
    var ac1 = new Account( accountId = 123 };
    var ac2 = new Account( accountId = 555 };
    var return1 = GetDetails(15, ac1);
    var return2 = GetDetails(15, ac2);
}

この場合、キャッシュキーを「groupId = 15 + account = namespace.Account」として作成すると、誤った衝突が発生します。account.GetString()を呼び出すと型名が返されることを実行時に検出するにはどうすればよいですか?

4

2 に答える 2

3

一般的なキャッシュキーに文字列を使用しないでください。それは実際ToStringには設計されたものではありません。代わりに、とを使用EqualsGetHashCodeて同等性をチェックする必要があります。もちろん、のようToStringに、すべてのオブジェクトにはメソッドがEqualsありGetHashCodeます...しかし、幸いなことに、型が実際に平等のために設計されたというはるかにIEquatable<T>強力なシグナルを提供するインターフェースがあります。

したがって、任意のタイプXについて、そのタイプがを実装しているかどうかを確認するだけIEquatable<X>です。もしそうなら、キャッシュキーとして使用するのが合理的であるはずです。ジェネリックメソッドを作成している場合は、次のことを強制できます。

void Foo<T>(T key, /* other parameters */) where T : IEquatable<T>
于 2012-09-29T18:44:11.263 に答える
0

「ToString」メソッドの実装がわかりません(ご存知のとおり、誰かが「Object」の「ToString」をオーバーロードしましたが、「Object」の実装と同じ方法で実装しました)。

ToStringをオブジェクトの一種のハッシュとして使用することはできません。同じフルネームと異なるID(または画像のようなASCII以外の値)を持つ2つの「Student」オブジェクトのような2つの論理的に異なるオブジェクトについて考えてみてください。実際のハッシュを使用する必要があります-「GetHashCode」を参照してください。

「GetHashCode」がオプションでない場合は、より多くの情報が必要になります(「理由」など)

于 2012-09-29T17:07:01.893 に答える