問題タブ [equals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
7 に答える
13755 参照

sql - SQL JOIN: ON と等しい

以下の間に大きな違いはありますか?

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

SO ユーザーはどちらかを優先しますか?

0 投票する
3 に答える
17748 参照

c# - C# でのインターフェイス ベースのプログラミングによる演算子のオーバーロード

バックグラウンド

現在のプロジェクトでインターフェイス ベースのプログラミングを使用していますが、演算子 (具体的には等値演算子と不等値演算子) をオーバーロードするときに問題が発生しました。


仮定

  • C# 3.0、.NET 3.5、および Visual Studio 2008 を使用しています

更新 - 次の仮定は誤りでした!

  • すべての比較で operator== ではなく Equals を使用することを要求することは、特に型をライブラリ (コレクションなど) に渡す場合には、実行可能な解決策ではありません。

operator== ではなく Equals を使用する必要があることを懸念していた理由は、.NET ガイドラインのどこにも、operator== ではなく Equals を使用すると述べているか、またはそれを提案することさえなかったからです。ただし、 Equals と Operator== をオーバーライドするためのガイドラインを読み直した後、次のことがわかりました。

デフォルトでは、演算子 == は、2 つの参照が同じオブジェクトを示しているかどうかを判断することにより、参照が等しいかどうかをテストします。したがって、参照型は、この機能を得るために operator == を実装する必要はありません。型が不変の場合、つまり、インスタンスに含まれるデータを変更できない場合、演算子 == をオーバーロードして、参照の等価性ではなく値の等価性を比較すると便利です。これは、不変オブジェクトとして long と同じと見なすことができるためです。値が同じだからです。不変でない型で operator == をオーバーライドすることはお勧めできません。

およびこの等価インターフェイス

IEquatable インターフェイスは、Contains、IndexOf、LastIndexOf、Remove などのメソッドで等しいかどうかをテストするときに、Dictionary、List、LinkedList などの汎用コレクション オブジェクトによって使用されます。ジェネリック コレクションに格納される可能性のあるすべてのオブジェクトに対して実装する必要があります。


制約

  • どのソリューションでも、オブジェクトをインターフェイスから具象型にキャストする必要があってはなりません。

問題

  • operator== の両側がインターフェースである場合、基礎となる具象型の operator== オーバーロード メソッド シグネチャが一致しないため、デフォルトの Object operator== メソッドが呼び出されます。
  • クラスで演算子をオーバーロードする場合、二項演算子のパラメーターの少なくとも 1 つが含まれている型である必要があります。そうでない場合、コンパイラ エラーが生成されます (エラー BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx )
  • インターフェイスで実装を指定することはできません

問題を示す以下のコードと出力を参照してください。


質問

インターフェイスベースのプログラミングを使用する場合、クラスに適切な演算子のオーバーロードをどのように提供しますか?


参考文献

== 演算子 (C# リファレンス)

定義済みの値の型の場合、等価演算子 (==) は、オペランドの値が等しい場合は true を返し、そうでない場合は false を返します。文字列以外の参照型の場合、2 つのオペランドが同じオブジェクトを参照している場合、== は true を返します。文字列型の場合、== は文字列の値を比較します。


関連項目


コード


出力

0 投票する
9 に答える
34391 参照

java - Java で文字型、整数型、および類似の型を比較す​​る: equals または == を使用しますか?

Java で何かを確認したかったのです。文字、整数、または長整数などがある場合、equals を使用する必要がありますか、それとも == で十分ですか?

文字列では、一意の各文字列のインスタンスが 1 つだけであるという保証がないことはわかっていますが、他のボックス化された型についてはわかりません。

私の直感では equals を使用しますが、パフォーマンスを無駄にしないようにしたいと考えています。

0 投票する
2 に答える
2201 参照

c# - C# Assert.AreNotEqual と Equals

C# Equals for IEnumerables が参照 equals であることを自分自身で確認しようとしているときに、奇妙なことがわかりました。NUnitで次の設定を行う

このテスト

合格、このテスト中

しません。誰も理由を説明できますか?

編集:答えてくれてありがとう。NUnit のドキュメントを読んだところ、コレクションの AreEqual と AreNotEqual がコレクションの各要素の等価性をテストするという同じことが書かれています。私は、AreEqual と AreNotEqual が単純な Equals を使用しているだけであるという考えに固執していたと思います。

0 投票する
6 に答える
5874 参照

c# - Equals のオーバーライドと文字列との比較

文字列メンバーを持つ C# クラスを定義しました。すべての目的のために、このクラスは string のサブクラスであると考えてください (ただし、許可されていません)。特定の形式に一致する厳密に型指定された文字列フィールドを表すために使用しています (これを大幅に簡略化しました)。

ここで、このクラスを他の文字列 (オブジェクトまたはリテラル) と直接比較できるようにしたいと考えています。したがって、クラスに次のように実装しました。

単体テストを作成しているときに、Assert.AreEqual に引数を渡す順序に応じて、異なる結果が得られます。

これは、最初のアサートで field.Equals() を呼び出しており、2 番目のアサートで String.Equals() を呼び出しているためだと思います。明らかに、私はこれに間違った角度からアプローチしています。誰でも私に洞察を与えることができますか?

もう1つ。ここで構造体 (値型) を使用することはできません。実際のケースでは、これらすべてを基本クラスで定義し、そこから継承しているためです。

0 投票する
19 に答える
367702 参照

c# - ==とEquals()のC#の違い

2つの文字列を比較するSilverlightアプリケーションの条件があります。何らかの理由で、使用する==false.Equals()返され、 trueが返されます。

コードは次のとおりです。

これが起こっている理由について何か理由はありますか?

0 投票する
5 に答える
5674 参照

c# - c# の 2 つの値が等しいかどうかを確認するにはどうすればよいですか? (任意の型の値を指定)

ここにこのコードがあります。これは、あらゆるタイプの引数を許可することを目的としています。

いくつかの int を使用して呼び出すと、うまく動作しません。