Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Vergleichsoperator ===
kolli
myCSharp.de - Member



Dabei seit:
Beiträge: 80

Themenstarter:

Vergleichsoperator ===

beantworten | zitieren | melden

Hi,

ich hab beim stöbern auf Wikipedia gerade folgenden Artikel gelesen:
http://de.wikipedia.org/wiki/Vergleichsoperator

Dort steht in der Tabelle der Vergleichsoperator "===", der auf Identität prüft. Was genau ist in einer programmierssprache/der Informatik/boolschen Logik der Unterschied zwischen "gleich" und "identisch"?

Und die wichtigste Frage: wann und warum sollte ich das in C# verwenden/vermeiden?
private Nachricht | Beiträge des Benutzers
Neals
myCSharp.de - Member



Dabei seit:
Beiträge: 203
Herkunft: Nordseeküste

beantworten | zitieren | melden

Würde spontan schätzen, das identisch bedeutet, dass die Variablen auf den gleichen Speicherplatz zeigen. Gleich würde dann nur bedeuten das die Inhalte den gleichen Wert aufweisen.
Signatur.Text = "Greetz, Neals";
private Nachricht | Beiträge des Benutzers
kolli
myCSharp.de - Member



Dabei seit:
Beiträge: 80

Themenstarter:

beantworten | zitieren | melden

Würde das nicht implizieren, dass es Pointer gibt? Aber die gibt es in C# ja nicht.
private Nachricht | Beiträge des Benutzers
Neals
myCSharp.de - Member



Dabei seit:
Beiträge: 203
Herkunft: Nordseeküste

beantworten | zitieren | melden

Indirekt sind die Variablen ja Zeiger auf Speicherplätze. Es gibt Pointer in C#, aber die werden als "unsafe" behandelt.
Signatur.Text = "Greetz, Neals";
private Nachricht | Beiträge des Benutzers
kolli
myCSharp.de - Member



Dabei seit:
Beiträge: 80

Themenstarter:

beantworten | zitieren | melden

Ah, das wusste ich gar nicht. Hab schnell mal nach "C# Pointer" gegooglet:
Der Operator wird auf WP auch mit "=== *" bezeichnet, wobei der Stern für den Pointer steht.

Also kann man davon ausgehen, dass man das im normalen Leben niemals brauchen wird, oder?
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 704
Herkunft: Österreich/Kärnten

beantworten | zitieren | melden

Den Operator "===" gibt es nur in PHP und JavaScript und prüft, ob zwei Variablen vom selben Typ UND den selben Wert haben. Da es PHP ja nicht so genau nimmt mit den Datentypen, kann das manchmal gebraucht werden (mir fiele aber kein konkreter Anwendungsfall ein).

In C# und sonstigen streng typisierten Sprachen ist so ein Operator eh überflüssig.
private Nachricht | Beiträge des Benutzers
Neals
myCSharp.de - Member



Dabei seit:
Beiträge: 203
Herkunft: Nordseeküste

beantworten | zitieren | melden

Gibt ja Wertklassen wie Strukturen und Klassen sind Referenzklassen...

wenn du ne Klasse erstellst und auf nen zweiten Namen "kopierst":

Class klasse = new Class();
Class kopie = klasse;

Dann "kopie" ne neue Referenz auf die Class.

klass.Value = 1;
Console.WriteLine(kopie.Value.ToString()

Würde den Wert 1 geben, da es auf den gleichen Speicher zeigt.
Signatur.Text = "Greetz, Neals";
private Nachricht | Beiträge des Benutzers
Uwe81
myCSharp.de - Member



Dabei seit:
Beiträge: 282
Herkunft: Ludwigshafen

beantworten | zitieren | melden

Z.B. bei PHP gibt es diesen Operator.

Dort existiert keine Typsicherheit, daher kann es zu komischen Ergebnissen kommen.
Der Operator == bedeutet "gleicher Wert" (wie auch immer das zu interpretieren ist) und === bedeutet gleicher wert und gleicher typ.


Das hat relativ unabsehbare Konsequenzen. Denn warum "0" == 0 ist, ist mir noch klar, aber warum in der tat für jeden string string == 0 ist verstehe ich nicht.

Das kann man eben über den Operator === prüfen, dann ist nicht "0" === 0. Man muss aber auch hier aufpassen, denn es gilt auch nicht 0.0 === 0, weil 0.0 intern als double und 0 intern als int representiert werden, also verschiedene Typen haben.

Grüß,
Uwe
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Uwe81 am .
private Nachricht | Beiträge des Benutzers
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 193
Herkunft: Erlangen

beantworten | zitieren | melden

In PHP braucht man den === selten, um zu überprüfen, ob eine boolsche Variable genau den Wert "true" hat. Denn in PHP steht zum Beispiel jeder Zahlenwert (außer 0) für true. Ich kann mich grob daran erinnern, dass es eine Funktion gibt, die entweder eine Zahl ausspruckt, oder false, wenn nichts gefunden wurde. Wenn man dort nur auf false überprüfen würde, wäre auch der legitime Wert 0 im einfachen Vergleich ( == ) false, aber nicht mit ===.

Aus dem Grund, anders als bei C#, sollte man boolsche Variablen auch mit

if ($variable == true)

abfragen, nicht nur mit if ($variable).

*Alle Angaben ohne Gewähr. Ist schon eine Weile her.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Jack_AI am .
private Nachricht | Beiträge des Benutzers
hinrich
myCSharp.de - Member



Dabei seit:
Beiträge: 116
Herkunft: Schleswig-Holstein

beantworten | zitieren | melden

Das ist zwar alles etwas OT, aber sei's drum, denn eigentlich ist es logisch:
Zitat von Uwe81
Denn warum "0" == 0 ist, ist mir noch klar, aber warum in der tat für jeden string string == 0 ist verstehe ich nicht.

Es war einmal vor langer Zeit ein Compiler. Wenn man dort mit Hilfe der mitgelieferten Systembibliothek (Neudeutsch: Library) aus einer Zeichenkette eine Zahl extrahieren wollte, so wurde aus "0123test" vielleicht nicht ganz logisch, aber verständlich und bequem für den Programmierer 123. Und in der Konsequenz wurde das Ergebnis einer Zeichenkette, die keine Ziffern am Anfang enthielt, 0.

Die Entwickler von PHP haben das wohl übernommen, denn in der Konsequenz geht folgendes:
[php]
<?php
$testString1 = "0123test";
$testString2 = "test0123";
echo "\$testString1 == 123 => " . (($testString1 == 123) ? "True" : "False") . "\n";
echo "\$testString2 == 123 => " . (($testString2 == 123) ? "True" : "False") . "\n";
?>
[/php]
Die Ausgabe ist dann auch wie in diesem Kontext erwartet:

hd@lan:~> php -f test.php
$testString1 == 123 => True
$testString2 == 123 => False
hd@lan:~>
Dieser völlig verwahrloste Umgang mit Datentypen hat dann einige Entwickler wohl dazu getrieben, zumindest Elemente in die Sprache zu bringen, die Typenschärfe zeigen, wenn sie schon nicht strenge Typen insgesamt durchsetzen können. Und so entstanden dann eben die (imho) sehr hilfreichen Operatoren === und !==.
Zitat von hauptmann
(mir fiele aber kein konkreter Anwendungsfall ein)

Nun, PHP ist eine Skriptsprache, bei der man es mit Typen nicht so genau nimmt. Warum auch? Es geht doch darum, schnell einen Batch On The Fly zu erledigen. Und die mit PHP zusammengeschraubte Web-Site nutzt intensiv Zeichenketten, vor allem aus dem Array $_REQUEST. Da ich mal davon gehört habe, dass es sinnvoll sein könnte, Variablen aus diesem Array einer etwas gründlicheren Prüfung zu unterziehen (keine Ahnung, wieso eigentlich), bleibt einem kaum eine Funktion wie strpos erspart. Die liefert aber $needle aus dem Heuhaufen als 0-basierten Index und FALSE wenn der Heuhaufen doch nicht pikt. Und ich könnte mir vorstellen, dass die Erkennung einer Zeichenkette wie "; DROP TABLE ..." durchaus für den einen oder anderen von einem gewissen, wenngleich untergeordnetem Interesse sein könnte...
Zitat von hauptmann
In C# und sonstigen streng typisierten Sprachen ist so ein Operator eh überflüssig.

Eben.
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo zusammen
Zitat von Neals
wenn du ne Klasse erstellst und auf nen zweiten Namen "kopierst":

Class klasse = new Class();
Class kopie = klasse;

Dann "kopie" ne neue Referenz auf die Class.
Beide Variabeln halten die gleiche Referenz auf das gleiche Objekt, ja.


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Peter Bucher,
Zitat
Beide Variabeln halten die gleiche Referenz auf das gleiche Objekt, ja.
auf dasselbe Objekt. :-) In dem Thread geht es ja unter anderem auch um den Unterschied zwischen das gleiche und dasselbe.

herbivore
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 5.940
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo herbivore
Zitat von herbivore
Zitat
Beide Variabeln halten die gleiche Referenz auf das gleiche Objekt, ja.
auf dasselbe Objekt. :-) In dem Thread geht es ja unter anderem auch um den Unterschied zwischen das gleiche und dasselbe.
Ja klar, das ist eine Frage der Interpretation.
Korrekt und unmissverständlich in diesem Kontext wäre natürlich schon "dasselbe" :-)


Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 704
Herkunft: Österreich/Kärnten

beantworten | zitieren | melden

OT aber ...
Zitat von hinrich
Nun, PHP ist eine Skriptsprache, bei der man es mit Typen nicht so genau nimmt. Warum auch? Es geht doch darum, schnell einen Batch On The Fly zu erledigen. Und die mit PHP zusammengeschraubte Web-Site nutzt intensiv Zeichenketten, vor allem aus dem Array $_REQUEST. Da ich mal davon gehört habe, dass es sinnvoll sein könnte, Variablen aus diesem Array einer etwas gründlicheren Prüfung zu unterziehen (keine Ahnung, wieso eigentlich), bleibt einem kaum eine Funktion wie strpos erspart. Die liefert aber $needle aus dem Heuhaufen als 0-basierten Index und FALSE wenn der Heuhaufen doch nicht pikt. Und ich könnte mir vorstellen, dass die Erkennung einer Zeichenkette wie "; DROP TABLE ..." durchaus für den einen oder anderen von einem gewissen, wenngleich untergeordnetem Interesse sein könnte...

Niemand würde in PHP eine SQL Injection zu Fuß ausprogrammieren. Gibt nicht umsonst mysql_real_escape_string ... aber grundsätzlich natürlich richtig, was du schreibst, nur ist der "===" Operator in PHP wirklich von recht geringer praktischer Bedeutung.
private Nachricht | Beiträge des Benutzers