Equals?



  • Hey

    kann mir jemand erklären wieso die ausgabe:

    ...ungleich
    ...gleich

    ist?

    namespace Test
    {
    	class Program
    	{
    		static void Main(string[] args)
    		{
    			Circle kreis1 = new Circle();
    			Circle kreis2 = new Circle();
    			Circle kreis3 = kreis1;
    			kreis1.Radius = 4711;
    			kreis2.Radius = 4711;
    			Console.Write("Die Objekte kreis1 und kreis2 sind ");
    			if (kreis1.Equals(kreis2)) // *****
    				Console.WriteLine("gleich");
    			else
    				Console.WriteLine("ungleich");
    			Console.Write("Die Objekte kreis1 und kreis3 sind ");
    			if (kreis1.Equals(kreis3))
    				Console.WriteLine("gleich");
    			else
    				Console.WriteLine("ungleich");
    			Console.ReadLine();
    		}
    	}
    
    	class Circle
    	{
    		public int Radius = 0;
    	}
    }
    

    *****
    Hier sollte WAHR rauskommen! Kreis1 hat einen Radius von 4711 und Kreis2 hat einen Radius von 4711 -> Und Equals überprüft 2 Referenztypen auf ihren Inhalt! Wieso kommt also hier FALSCH raus?!

    ReferenceEquals überprüft 2 Referenztypen auf ihre Speicheradressen. Also ob sie eine Instanz sind.

    Bitte korrigiert mich, wenn ich falsch liege. Just a newbie!



  • Du überprüfst ob kreis1 == kreis2 ist.
    Da du aber

    Circle kreis1 = new Circle();
    Circle kreis2 = new Circle();
    

    machst und nicht

    Circle kreis1 = new Circle();
    Circle kreis2 = kreis1;
    

    kann dabei kein true rauskommen. Du überprüfst ob das kreis1 Objekt das gleiche wie das kreis2 Objekt ist.
    Bei deiner Zuweisung von kreis3 = kreis1 kannst du wiederrum prüfen, ob es sich um das gleiche Objekt handelt, denn du weißt das Original zu.
    Wenn du beide Radiuswerte der beiden Objekte vergleichen willst, dann so

    if(kreis1.Radius.Equals(kreis2.Radius))
    {
        //...
    }
    


  • Newbieeee schrieb:

    Hey

    Kreis1 hat einen Radius von 4711 und Kreis2 hat einen Radius von 4711 -> Und Equals überprüft 2 Referenztypen auf ihren Inhalt! Wieso kommt also hier FALSCH raus?!

    Falsch. Wenn ich von deiner Aktuellen Implementation ausgehe so wie ich sie da sehe, hat dein Circle kein Equals implementiert, heißt er prüft die Referenzen. Willst du eine benutzerdefinierte "Gleichheit" erzeugen, so überschreibe entweder die object-Equals Methode oder was meines Erachtens besser ist, implementiere das IEquatable<T> Interface. Hand in Hand mit Equals sollte unteranderem GetHashCode gehen.



  • Ok, ich denke ich verstehe das.
    Da ich Equals nicht überschrieben habe, vergleicht er nur die Referenzen.

    Gut, da ich von der C,C++-Dimension komme, wollte ich euch noch fragen ob dieses Buch gut ist.

    Danke für eure Antworten!



  • Ich finde das Buch schlecht, weil versucht wird auf zuwenig Seiten zuviel reinzupressen. Das Buch verkommt zu einer reinen feature list. Aber du kannst es doch selber lesen, es ist öffentlich zugängig. Es gibt noch ein zweites:
    http://openbook.galileocomputing.de/csharp/



  • Naja einem geschenkten Gaul, schaut man nicht ins Maul 😃
    Wenn es kostenlos auf der Seite zur Verfügung steht, kannst du es gerne lesen. Aber wenn du nicht willst, dass du später verwirrt da stehst, weil es nicht gut erklärt wird, wie witte meint, dann halt nach einem anderen Ausschau.



  • Also ich kann nur die Bibel empfehlen:
    Visual C# 2008 | ISBN: 3827326419
    Am 12 soll ja .Net 4.0 raus kommen, entsprechend gibt es da noch keine Bücher, aber ich denke mir das es zum lernen trotzdem ideal ist.
    Ich habe es in meiner Büchersammlung unter den Top 3.

    PS. Für WPF weiterhin ungeschlagen:
    Windows Presentation Foundation Unleashed | ISBN: 0672328917



  • Wenn wir schon dabei sind. Diese hier ist für etwas fortgeschrittenere Sachen.

    http://www.amazon.de/C-sharp-2008-Trey-Nash/dp/3772364101/ref=sr_1_1?ie=UTF8&s=books&qid=1270731640&sr=8-1



  • Bücher will ich mir ( ?noch? ) nicht kaufen. Es kommen ja bald die 2010er Bücher raus. Da lerne ich lieber aus den Openbooks.
    Also das "Visual C# 2008 - Das Umfassende Handbuch" ist im Vergleich zu "C#" viel kleiner. Ich werde mir das "C#" zu Herzen nehmen. Danke!


Anmelden zum Antworten