2016-03-11 24 views
5

Wiem, że to może brzmieć jak bardzo głupie pytanie, ale nie mam na nie odpowiedzi. Jeden z naszych użytkowników zgłosił ostatnio błąd i zdałem sobie sprawę, że stary kod używał != string.Empty raczej niż IsNullOrEmpty(). Naprawiłem to za pomocą IsNullOrEmpty() i teraz działa dobrze, ale chciałbym zrozumieć problem. Problem polega na tym, że ten sam bit kodu działa inaczej na niektórych komputerach. Zasadniczo mam obiekt: context["MODE"], który powinien być pusty. Dodałem kilka testów na to, aby się zalogować:Porównywanie ciągów z! = Operator dającym różne wyniki?

 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())); 

Oto moje logi o tym szczegółów terenowych:

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

Oto jego kłody:

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

Jak widać istnieje jedna różnica: MODE != string.Empty jest Fałszywe dla mnie (ma sens), Prawda dla niego! MODE oczywiście nie jest puste (w przeciwnym razie nie powiodłoby się .ToString()) Problem został rozwiązany za pomocą IsNullOrEmpty, ale staram się dowiedzieć, dlaczego to nie działa na niektórych komputerach użytkownika, a nie innych. Zazwyczaj z moimi testami niektórzy z nas nie mieli problemów, inni mieli.

Nie bardzo rozumiem, czego mogę się dowiedzieć. Dlaczego jego tryb różni się od wartości null i String.Empty, ale IsNullOrEmpty zwraca wartość true? Należy również pamiętać, że przycięcie to w rzeczywistości string.Empty oraz

Dziękujemy!

+1

'IsNullOrEmpty' faktycznie robi pustą część porównując' Length' 0. – juharr

+1

Spróbuj również drukowanie 'kontekst [„Mode”]. GetType(). Nazwa również. – juharr

+0

Czy możesz podać więcej szczegółów dotyczących pochodzenia wartości w 'kontekście [" MODE "]'? Czy zapewniliście, że wersje .NET są takie same na obu maszynach? –

Odpowiedz

4

Jeśli używasz ToString(), oznacza to, że typ context["MODE"] to object. Jeśli porównujesz obiekt z ciągiem przy użyciu !=, porównujesz odwołania do łańcuchów, a nie rzeczywiste wartości ciągów.

Tak więc "jego tryb" jest pustym łańcuchem, który nie jest taki sam, jak string.Empty.

Nie używaj porównań referencyjnych dla łańcuchów; zawsze upewnij się, że obie strony są typu string przed użyciem == lub !=.

Należy zauważyć, że kompilator C# powinien ostrzec Cię o tym: CS0252: Possible unintended reference comparison

+0

@clcto To jest poprawne wyjście, ponieważ nie jest równe 'String.Empty' zwróciło fałsz, co oznacza, że ​​jest równe' String.Empty' – Setsu

+0

Jak powiedziałem, był to stary kod napisany przez gościa, który brał opieka nad aplikacją, zanim dołączyłem do firmy tutaj (i tak, było ostrzeżenie, które przegapił!). Zastanawiam się raczej, dlaczego jego wyniki są w ten sposób? Jego dane wejściowe są puste, ale nie mają tego samego odniesienia, co "string.Empty". Jednak gdy go przycinam, ma to samo odniesienie! Jak to się mogło stać? – Damascus

+0

Typem zwrotnym 'Trim()' jest 'string', więc kompilator używa w tym przypadku porównania wartości. – Daniel

Powiązane problemy