2016-03-11 4 views
5

これは非常にばかげた質問のように聞こえるかもしれませんが、私はこの回答には答えがありません。私たちのユーザーの1人が最近バグを報告しました。コードの古いコードがIsNullOrEmpty()ではなく!= string.Emptyを使用していることに気付きました。私はIsNullOrEmpty()で修正しましたが、今はうまく動作しますが、実際に問題を理解したいと思います。文字列と!=演算子を比較すると、結果は異なりますか?

実際には、特定のマシンで全く同じコードが実行されます。私は基本的にオブジェクトを持っています:context["MODE"]、それは空であるはずです。私は、ログに記録することでいくつかのテストを追加しました:ここ

 contextBuilder.AppendLine("MODE: |" + context["MODE"] + "|"); 
     contextBuilder.AppendLine("MODE != string.Empty: " + (context["MODE"] != string.Empty)); 
     contextBuilder.AppendLine("MODE TRIM != string.Empty: " + (context["MODE"].ToString().Trim() != string.Empty)); 
     contextBuilder.AppendLine("MODE.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString())); 
     contextBuilder.AppendLine("MODE.TRIM.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString().Trim())); 

は、そのフィールドの詳細についての私のログです:ここでは

MODE: || 
MODE != string.Empty: False 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

は彼のログです:あなたがそこに見ることができるように

MODE: || 
MODE != string.Empty: True 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

されます1つの違い:MODE != string.Emptyは私のためにFalseです(意味をなさない)、彼のために真実! MODEは明らかにnullではありません(そうでないと.ToString()は失敗します)。問題はIsNullOrEmptyを使用して解決されますが、これは特定のユーザーのマシンでは機能しない理由を正確に把握しようとしています。通常私のテストでは、私たちの何人かに問題はなく、他の人には問題がなかった。

私はそれについて何が学べるのか分かりません。彼のモードがnullで、String.Emptyと異なるのはなぜですか?IsNullOrEmptyはtrueを返しますか?また、トリムが実際にstring.Empty同様

はありがとうございあることに注意してください!

+1

'IsNullOrEmpty'が実際に'コンテキスト[「モード」]プリントアウトも試してみてください0 – juharr

+1

に 'Length'を比較することによって、空の部分を行います。 GetType()。Name'も同様です。 – juharr

+0

'context [" MODE "]'で値の起源についてもっと詳しく説明できますか?また、両方のマシンで.NETのバージョンが同じであることを確認しましたか? –

答えて

4

ToString()を使用すると、context["MODE"]のタイプがobjectであることがわかります。 !=を使用してオブジェクトを文字列と比較すると、実際の文字列値ではなく、文字列参照を比較しています。

だから、「彼のモードは」string.Emptyと同一の参照ではありません空の文字列です。

文字列で参照比較を使用しないでください。 ==または!=を使用する前に、必ず両側のタイプがstringであることを確認してください。 C#コンパイラはこれについてあなたに警告している必要があることを

注:CS0252: Possible unintended reference comparison

+0

は、正しい出力です私がここに会社に入社する前に、アプリの世話をしてください(そして、ええ、彼が逃したという警告がありました!)。私はむしろなぜ彼の結果がこのようになっているのかと疑問に思います。彼の入力は空ですが、 'string.Empty'と同じ参照を持っていません。しかし、私はそれをトリムするときに同じ参照があります!これはどうやって起こりますか? – Setsu

+0

に等しい_is_ことを意味し、falseを返したため、それ@clcto – Damascus

+0

'Trim()'の戻り値の型は 'string'なので、コンパイラはその場合に値の比較を使います。 – Daniel

関連する問題