問題タブ [equals-operator]
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.
java - == はブール値の完全な等価性をチェックしますか? - ジャワ
したがって、2 つの文字列を == で比較すると、両方が同じオブジェクト/インスタンスを参照している場合にのみ true が返されると聞いたことがあります。それが弦です。ブール値はどうですか?
linq - Linq To Sql Where はオーバーライドされた Equals を呼び出さない
私は現在、同様の非データベース (この議論のサービス層オブジェクト) オブジェクトと LinqToSql を介してデータベースから取得したオブジェクトを比較するプロジェクトに取り組んでいます。この説明のために、データベースで表される文字列フィールドを持つサービス レイヤー Product オブジェクトがあると仮定します。ただし、データベースには、サービス層で表されない主キー ID もあります。
したがって (単体テストなどでよく行うように)、次のようなコードを記述できることを期待して、Equals(Object)、Equals(Product)、および GetHashCode をオーバーライドし、IEquatable を実装しました。
などなど。
Equals オーバーライドはテスト済みで動作します。オブジェクトは可変であるため、GetHashCode オーバーライドには通常の注意事項が適用されます。ただし、この例では、オブジェクトは LtS 以外では変更されず、読み取り専用にすることができます。
簡単なテストは次のとおりです。
- メモリ内にテスト オブジェクトを作成し、LtS コンテキストにコミットします。コミットすると、テスト オブジェクトにいくつかの自動生成されたフィールドが入力されます。
- メモリ内に別の同一のテスト オブジェクトを作成する (別参照)
2 番目のオブジェクトを条件として使用して、データベースから最初のオブジェクトを取得しようとします。(上記のコード行を参照)。
/li>
Retrieve の簡略化されたバージョン (削除されたクラフトはパラメーター チェックなどだけです):
注意: オーバーライドされた Equals メソッドは、データベースから自動生成されたフィールドを気にしないことを認識しており、サービス層で表される文字列のみを調べます。
これが私が観察したことです: testProduct1 での取得は成功します (驚くことではありません。参照によって等しい) testProduct2 での取得は失敗します (null) SubmitChanges のコンテキストによって (データベースに最初のテスト オブジェクトを作成するときに呼び出されます) (期待どおりに動作します)。
静的に、コンパイラは、出力されるオブジェクトの型を認識し、型を解決できます。
だから私の具体的な質問:
- 私は何か悪いことをしようとしていますか? Equals の単純な使用法のようです。
- 最初の質問の結果: 比較の詳細をリポジトリではなくオブジェクト内に保持しながら、linq から sql への等価性チェックに対処するための代替提案
- Equals メソッドが SubmitChanges で解決されているのに、Where 句では解決されていないのはなぜですか?
- Equals 呼び出しを機能させるのと同じくらい、理解することに関心があります。しかし、LtS と C# のコンテストで「アンチパターン」と思われる理由を理解するだけでなく、この「パターン」を機能させる方法も学びたいと思っています。
Whereステートメントを使用してコンテキストを直接フィルタリングすることを提案しないでください。明らかに、Equals 呼び出しを削除してそれを行うことができます。ただし、他のオブジェクトの一部 (ここでは示していません) は大きく、少し複雑です。保守と明確化のために、理想的には問題のオブジェクトの一部として、自分自身を同じタイプの別の場所と比較する方法についての知識を保持したいと思います。
私が試した他のいくつかのことは、動作を変えませんでした:
- オーバーロードされ、代わりに == が使用されました
- ラムダ変数を p => (Product)p 型にキャストする
- 最初に IQueryable オブジェクトを取得し、Where 句で Equals を呼び出します
私が試した他のいくつかのことはうまくいきませんでした:
- 静的な ProductEquals (製品が最初、製品が 2 番目) メソッドの作成: System.NotSupportedException: SQL へのサポートされた変換がありません。
StackOverflow の貢献者に感謝します。
重複の可能性について: 他に ~10 の質問を読みました。正確な複製へのポインタが欲しいのですが、ほとんどはLinqToSqlの奇妙な点に直接対処していないようです。
c# - ジェネリック メソッドで null の非クラス制約型パラメーターのインスタンスをチェックする
私は現在、パラメーターを操作する前にパラメーターの検証を行いたい汎用メソッドを持っています。具体的には、型パラメーターのインスタンスがT
参照型の場合、それが参照型かどうかを確認し、nullnull
の場合はスローします。ArgumentNullException
次のようなもの:
class
制約を使用して型パラメーターを制約したくないことに注意してください。
「ジェネリック型をデフォルト値と比較するにはどうすればよいですか?」に関するMarc Gravellの回答を使用できると思いました。、次のようにクラスを使用します。EqualityComparer<T>
しかし、次の呼び出しで非常にあいまいなエラーが発生しますEquals
。
メンバー 'object.Equals(object, object)' には、インスタンス参照ではアクセスできません。代わりに型名で修飾してください
が値または参照型であることに制約されていない場合、どのようにインスタンスをチェックできますT
か?null
T
c# - nullのオーバーロード==演算子
Message
これらの演算子をオーバーロードするというクラスがあります。
==
と演算子で、と!=
以外の型の参照を比較し続けてほしいのですが、String
Message
私にこれを与えます:
次のメソッドまたはプロパティ間で呼び出しがあいまいです:'Message.operator ==(Message、Message)'と'Message.operator ==(Message、string)'
Message
とは両方ともString
参照型であり、どちらも参照型である可能性があるためですが、メッセージがnullかどうかを確認するためにopreatornull
を使用できるようにしたいと思います。==
==
null値でオーバーロードできますか?私はそれをオーバーロードしてオーバーロードobject
を呼び出してみobject.ReferenceEquals(object, object)
ましたが、それは役に立ちませんでした。
java - 実装equals()メソッドデザインパターン
equals()
Javaでメソッドを実装するのに役立つデザインパターン(またはイディオム)はありますか?
その作業はそれほど難しいことではありませんが、ほとんどの場合、ほぼ同じです...そのため、パターンがあると思いますが、見つかりませんでした。
私はメソッドを選択しました:generate equals() method in Eclipse
しかし...私は(AbstractListで)生成されたコードをより良くするための良い方法を見つけました:
生成される代わりに:
c# - 繰り返されるボクシングは異なる参照を作成しますか?
私はこのコードを理解しようとしています:
- 新しいボクシングごとに、オブジェクト b の異なる参照が作成されますか?
- 1. が正しい場合、
o.Equals(b)
なぜtrue
? - 参照をチェックしない場合
Equals
、なぜo.Equals(3)
ですかfalse
?
ありがとう。
equals - var=1 と var=1 の違い
var=1 は実際には var = 1 とどう違うのですか? そして、これらの違いが本当に重要な言語と重要でない言語は何ですか?
c++ - C++は演算子に等しい
私は次のequals演算子を持っています:
私も試しました:
私の主な方法では、次のようになります。
私のプログラムは「壊れた」を出力し続けます。これは、dTest0とdTest1が実際には等しいことを示唆しています...どこが間違っているのでしょうか。
追加:使用する場合x.getHours == y.getHours...
それは下に赤い線を置き、"."
次のように言います:'エラー:バインドされた関数へのポインターは、関数を呼び出すためにのみ使用できます`。
何かアドバイスをいただければ幸いです。ありがとう。