- PR -

どんな型でも受け付けて比較できる方法はありますか?

投稿者投稿内容
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-05 13:30
クライエントIDが云々という当初の目的からは離れたのかな。

引用:
文字列リテラルにはインターンプールという仕組みが働きます。要は同じ文字列は同じインスタンスを使うって事ですが。
コンストラクタを使って作成した String インスタンスの場合は普通の参照比較になります。

stringは確かに、面白い実装をしていますね。逆に、

string test1 = "test"; //(1)
test1 = "change"; //(2)

(1)の時のtest1と(2)のときのtest1は異なる参照になりますね。
引用:
Object{string}(予想:リファレンス比較で全部false←ハズレ)
o = "123";
o2 = "123";
a = o.Equals(o2); //true ← stringとして比較
a = Equals(o, o2); //true ← stringとして比較
a = o == o2; //true ← stringとして比較
a = ReferenceEquals(o, o2);//true ← 別インスタンスじゃ無いのか??

下から2番目はstringとして比較はしていません。

o = new string(new char[] { '1' });
o2 = new string(new char[] { '1' });

とすれば o == o2 はfalseです。

ん、つまるところ型がobjectならReferenceEqualsでも==でも同じなのか。

こんなのもありますし、気になるならマニュアルをくまなく読みあさるといいと思います。
ここまで考えたことはなかったですね。objectにint突っ込んだりとか基本的にしませんから。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-05 14:38
引用:

ん、つまるところ型がobjectならReferenceEqualsでも==でも同じなのか。


その通りです。== がオーバーロードされていませんから。
考え方としては、operator==(object o1, object o2) の定義を使うと言った方が簡単かもしれませんね。operator==(object o1, object o2) は参照比較するように定義されていると。

引用:

ここまで考えたことはなかったですね。objectにint突っ込んだりとか基本的にしませんから。


こんな例もあります。
コード:
int i = 123;
object o1 = i;
object o2 = i;

Console.WriteLine( o1 == o2 ); // false


※キーワード ボクシング
_________________
囚人のジレンマな日々
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-06 06:27
あれ?上げたつもりで、上げてなかった。

引用:

このクラスから継承しても Id は object なので、どんな型でも渡せます。これでは、結局「比較する時にどうやって比較するかが分からない」という元の問題に戻ってしまいませんか?


ちょっと違います。セッターを定義していません。よって、実装側がここで、型のチェックをできます。^H^H チェックをするように制約をかけます。
また、IComparable も実装していないので、「比較の仕方」を定義しなければなりません。

 どのような型にするか、制限をかけつつ、自由を与えています。

スキルアップ/キャリアアップ(JOB@IT)