-1

今日は、== 演算子、Equal 関数、Object.ReferenceEqual メソッドについて読んでいました。

  • 演算子 == 等しい参照のチェックに使用されます。
  • 等しい方法 - 等しい値のチェックに使用されます。
  • Object.ReferenceEqual – 等しい参照のチェックに使用されます。

テスト コンソール アプリケーションを作成しました。いくつか質問があります。全部答えていただけると助かります。

class Program
{
    static void Main(string[] args)
    {

        int intValue = 5;
        string strValue = "5";
        Console.WriteLine(string.Format("{0}  ", intValue.ToString() == strValue));// Output is TRUE
        Console.WriteLine(string.Format("{0}  ", intValue.Equals(strValue))); // Output is FALSE
        Console.WriteLine(string.Format("{0}  ", intValue.ToString().Equals(strValue))); // Output is TRUE 
        Console.WriteLine(string.Format("{0}  ", object.ReferenceEquals(intValue, strValue)));// Output is FALSE
        Console.WriteLine(string.Format("{0}  ", object.ReferenceEquals(intValue.ToString(), strValue)));// Output is FALSE


        Console.Read(); 
    }

出力に 5 行あります。

1 行目 – 出力は True です。

私の知る限りでは、ここで私はキャスティングをしています。したがって、== 演算子チェック参照として TRUE を取得しています。

行 2 – 出力は False です。

問題 1. オブジェクトの機能チェック値が等しい。ここでは同じ値ですが、False になっています。なぜ?

3 行目 – 出力は True です。

質問 2. ここではキャストを行っているため、True を取得しています。なぜ?

4 行目。出力は False です。

私の知る限り、両方のオブジェクトは異なるタイプです。だから、私はFALSEになっています。

5 行目。出力は False です。

質問 3. ここでキャストを行っていますが、それでも False が返されます。なぜ?

質問 4. == 演算子と Object.ReferenceEqual の違いは何ですか?

4

3 に答える 3

1

オブジェクトの等価関数チェック値。ここでは同じ値ですが、False になっています。なぜ?

異なるタイプのオブジェクトが同じ値を持つことはあり得ません。最初のオブジェクトには 5 の整数値があり、2 番目のオブジェクトには文字列値があります"5"。文字列"5"は、整数値 5 の可能な表現の 1 つです。つまり、その 10 進数表現です。ただし、同じ値ではありません。結局のところ、"101"101 は 5 の 2 進数表現ですが、5 に等しいとは思わないでしょう。

ここではキャストを行っているため、True を取得しています。なぜ?

キャストを行っているのではなく、5 を 10 進数の文字列表現である に変換しています"5"

ここでキャストを行っていますが、それでも False を取得しています。なぜ?

同じ内容の別のオブジェクト (つまり、文字を含む単一の文字列) を取得するためです"5"

==Operator とはどう違いObject.ReferenceEqualますか?

Object.ReferenceEqualoperator のオーバーロードの可能性を無視します==

于 2016-07-02T12:31:50.160 に答える
1

これらのステートメントからあなたの心をクリアしてください:

演算子 == 等しい参照のチェックに使用されます。
等しい方法 - 等しい値のチェックに使用されます。

との両方operator==Equalsオーバーライドして、動作を変更できます。は仮想ではないためoperator==、どのメソッドが選択されるかはコンパイル時にEqualsわかりますが、オブジェクト タイプに基づいて実行時に選択されます。(適切なメソッドを選択するプロセス全体をメソッド解決と呼びます)

1 行目: Truestring.operator==コンパイラによって選択され、参照ではなく文字列を比較するためです。

2 行目: Falseint.Equals(object)はコンパイラによって選択され、( object)strValueは文字列ではなくint. intと等しくないstringので、偽です。

3 行目: Truestring.Equals(string)コンパイラによって選択され、参照ではなく値の等価性をチェックするためです。

4 行目: False。参照の等価object.ReferenceEquals性をチェックするため、答えは明らかです。

5 行目: False。同上。intValue.ToString()「5」の値でメモリ上に新しい文字列オブジェクトを作成しますが、それはポイントするオブジェクトと同じではないstrValueため、答えは偽です。

于 2016-07-02T12:32:13.327 に答える
0

質問 1: 型が Int32 の場合にのみ true を返しますが、それは文字列です https://msdn.microsoft.com/en-us/library/de3wwa8z(v=vs.110).aspx

質問 2: string.Equals は、値が同じである場合 (どちらの場合も "5") に true を返します。 https://msdn.microsoft.com/en-us/library/system.string.equals(v=vs.110).aspx

質問 3: これらは異なるオブジェクトを指しているため、ReferenceEqual は false を返します https://msdn.microsoft.com/nl-nl/library/system.object.referenceequals(v=vs.110).aspx

質問 4: == は、string を除いて、referenceequal と同じです。ただし、== 演算子はオーバーロードされる可能性があるため、ID をテストする場合は、ReferenceEquals を使用して ください https://msdn.microsoft.com/nl-nl/library/6a71f45d.aspx

于 2016-07-02T12:31:42.410 に答える