C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 54 を表示中)
■30615 / )  Re[6]: 参照型の等値演算子でboxingを回避したい
□投稿者/ NyaRuRu (81回)-(2008/12/27(Sat) 23:37:16)
2008/12/27(Sat) 23:58:45 編集(投稿者)
(追記:
同値性:equivalence, 等値性:equality なので,
BCL のスタンスはあくまで"等値性"の再定義ということですね.
C# の言語仕様も「参照型等値演算子」と.
http://msdn.microsoft.com/ja-jp/library/aa664727.aspx

私の誤解で失礼しました.
本投稿は無視して頂けると幸いです.
)

■No30613 (ほにゃ さん) に返信
> 参照型であれば、box命令があっても気にする必要はないのですね。
> 「なんで参照型なのにボックス化されるんだろう?」
> と悩んでいました。
> ありがとうございます。

念のため一点だけ確認したいのですが
タイトルには「参照型の等値演算子」とある一方で,
上に挙げられたコードの少なくとも Test2〜Test4 では
いわゆる参照の同一性を評価しているのが微妙に気になります.
(Test1 は == 演算子のオーバーロード次第)

例えば,以下のように HogeClass の Equals をオーバーライドして,
何と比較されても常に等しいと返すようにしたとします.

interface IHoge { }
class HogeClass : IHoge
{
    public override bool Equals(object obj) { return true; }
    public override int GetHashCode() { return 0; }
}

にもかかわらず,以下のコードは両方 False を返します.

Console.WriteLine(Test.Test3(new HogeClass(), new HogeClass()));
Console.WriteLine(Test.Test4(new HogeClass(), new HogeClass()));

これは,Test3/Test4 の IL が,常に参照の同一性を比較しようとする
ものだからなのですが,本当にこれは意図した動作ですか?
意図通りであれば,(等値演算子という表現は別として)
こちらの心配のしすぎでしたので読み飛ばしてください.

参考) http://d.hatena.ne.jp/siokoshou/20070527#p3

いわゆる同値性の再定義 (等値性をとるか同一性をとるか) に対応するのであれば,
以下のように IEquatable<T> を使うのがセオリーかなと.

static class Test2
{
    public static bool EqTest1<T>(T x, T y) where T : IHoge, IEquatable<T>
    { return x != null ? x.Equals(y) : y == null; }
    public static bool EqTest2<T>(T x, T y) where T : IHoge, IEquatable<T>
    { return EqualityComparer<T>.Default.Equals(x, y); }
}

解決済み
返信 編集キー/


管理者用

- Child Tree -