Laden...

Debugger zeigt falschen boolschen Wert beim string == string und string!=string

Erstellt von bigeddie vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.509 Views
B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren
Debugger zeigt falschen boolschen Wert beim string == string und string!=string

Hallo Gemeinde,

habe in div Setter-Methoden folgende Implikation:


if (value!=titel)
{
    titel=value;
    logPropertyname("Titel");
}

nun jedoch mein Problem:
Wenn ich an das Property Titel seinen eigenen Wert übergebe oder auch die gleiche Zeichenkette wie sie bereits in dem Member gespeichert ist übergebe, erhalte ich beim Debuggen für den Operator den Wert "false", es wird jedoch der Block des "true"-Pfades abgearbeitet.

Kennt jemand das Problem, welches sind die Ursachen und wie kann ich diese umgehen?

Grüße
Bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

R
156 Beiträge seit 2006
vor 13 Jahren

Hallo,

Strings müssen immer mit .Equals() verglichen werden, ansonsten vergleichst Du die Adressen und nicht die Werte.

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren

Hi Rahvin,

die Links sagen etwas anderes:

String.Inequality-Operator

String.Equality-Operator

Oder verstehe ich da was falsch?

Grüße

Bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

1.552 Beiträge seit 2010
vor 13 Jahren

Strings müssen immer mit .Equals() verglichen werden, ansonsten vergleichst Du die Adressen und nicht die Werte.

Seit wann?
edit: Das ist in Java der Fall, jedoch nicht in C#

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

5.742 Beiträge seit 2007
vor 13 Jahren

Strings müssen immer mit .Equals() verglichen werden, ansonsten vergleichst Du die Adressen und nicht die Werte.

Nein, das stimmt nicht.

Testweise kannst du es aber trotzdem mal probieren (also Vergleich via String.Equals) - evtl. liegt's am Immediate Window. Glaube ich aber eigentlich auch nicht.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Rahvin,

Strings müssen immer mit .Equals() verglichen werden, ansonsten vergleichst Du die Adressen und nicht die Werte.

das stimmt für C# nicht.

Hallo bigeddie,

wenn der Then-Teil ausgeführt wird, dann liefert die Bedingung offensichtlich true.

herbivore

203 Beiträge seit 2006
vor 13 Jahren

Strings müssen immer mit .Equals() verglichen werden, ansonsten vergleichst Du die Adressen und nicht die Werte.

nein. das ist nur bei objecten so, die die == und != opertoren nicht überschreiben.
mit echten System.String's solltest du kein solches problem haben


var foo1 = "foo";
var foo2 = new string(new char[] { 'f', 'o', 'o' });

Console.WriteLine(foo1 == foo2);
Console.WriteLine(foo1 == "foo");
R
156 Beiträge seit 2006
vor 13 Jahren

Ups, das war eindeutig 😃.

Dann sorry für meine Aussage, dass ist dann leider noch ein Javaüberbleibsel...
da wirft man manchmal etwas durcheinander 😉...

Sorry nochmals...

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren

Hi herbivore,

wenn ich einen Break-Point im Then-Teil setze und dann den Operator untersuche, dann erhalte ich für den Ausdruck FALSE, der Then-Teil dürfte also garnicht tangiert werden oder liege ich da falsch?

Grüße

Bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo bigeddie,

wenn der der Breakpoint im Then-Teil erreicht wird, dann hast du doch den Beweis, dass die Bedingung true geliefert hat.

herbivore

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren

Hi herbivore,

da liegt ja mein Prob, die condition lautet auf (value!=titel) und das liefert mir FALSE, wenn ich die Bedingung vor der Abarbeitung der ersten Zeile im Then-Teil überprüfe, also noch keine Änderungen an irgendwelchen Membern vollzogen sind.

Mit value.equals schein es zu funktioniren, aber warum nicht mit dem Operator und auch nur an dieser Stelle?

Grüße Bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

203 Beiträge seit 2006
vor 13 Jahren

ersetz mal dein if(value != title) durch


bool b1 = value != title;
bool b2 = !value.Equals(title);
if(b1 && b2)

dann kannst du im debugger mal schauen, ob b1 und b2 in deinem fall beide true sind; also value wirklich ungleich title

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren

Hi,

also nach langem Probieren habe ich den Code nochmal in eine äquivalente Klasse gepackt und die alte Klasse entsorgt und in der neuen Klasse funktioniert der Code wie ich ihn in der ersten Implementierung hatte problemlos.
Dachte, soetwas wäre nur bei Delphi möglich.

Grüße bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉