C# Frage

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

kennt sich hier jemand zufällig in C# aus?
Wie kann man eigentlich den == Operator überladen und trotzdem
einen null-Vergleich bzw. einen Referenzvergleich machen?

Variante 1 (in so gut wie allen Büchern sieht es so aus)
Code:
class Foo
{
  private long id;

  public Foo(long id)
  {
    this.id = id;
  }

  public override bool Equals(object obj)
  {
    return this.id == ((Foo)obj).id; 
  }

  public static bool operator == (Foo obj1, Foo obj2)
  {
    return obj1.Equals(obj2); // Hier die Nullpointer-Exception, war ja auch klar
  }

  ...

}
Variante 2
Code:
class Foo
{
  private long id;

  public Foo(long id)
  {
    this.id = id;
  }

  public override bool Equals(object obj)
  {
    return this.id == ((Foo)obj).id;
  }

  public static bool operator == (Foo obj1, Foo obj2)
  {
    if(obj1 == null) // Hier die Endlosschleife
      return obj2 == null;
    if(obj2 == null)
      return false;
    return obj1.Equals(obj2);
  }

  ...

}
Wenn man es verwendet, dann passiert folgendes:
Code:
Foo a = new Foo(1);
Foo b = null;

Console.WriteLine(a == b); // Bei Variante 1 OK
Console.WriteLine(b == a); // Bei Variante 1 Nullpointer-Exception

Console.WriteLine(a == b); // Bei Variante 2 Endlosschleife
Console.WriteLine(b == a); // Bei Variante 2 Endlosschleife

Wie kann man da einen Referenzvergleich erzwingen?

Danke
 
G

Guest

Gast
Ohh ja, danke. Hat geholfen.
Mann, ist die Syntax krank. Man muss eine konkette Instanz zu object casten :autsch:,
um einen Referenzvergleich zu machen (object implementiert einen Referenzvergleich)
oder System.Object.ReferenceEquals(a, b) verwenden.

Bei C++ ist gleich klar, wo Pass-By-Value, wo Pass-By-Reference kommt. In Java sowieso.
In C# ist es für mich nach einem Tag C# Turnen noch etwas unklar. ???:L :###
 

SnooP

Top Contributor
Hmm... ohne, dass ich das jetzt direkt wusste, hätte ich auch vermutetet, dass du nach Object casten kannst, um über das equals von Object den Referenzvergleich zu bekommen. Das ist nämlich in Java absolut genauso...
Also in sofern - so schlimm ist c# an der stelle nun nicht ;) -immerhin gibts die Möglichkeit Operatoren zu überladen schonmal.. ist doch für viele Anwendungen sicherlich ganz nett. Ich sach nur BigInteger...
 
G

Guest

Gast
SnooP hat gesagt.:
Hmm... ohne, dass ich das jetzt direkt wusste, hätte ich auch vermutetet, dass du nach Object casten kannst, um über das equals von Object den Referenzvergleich zu bekommen. Das ist nämlich in Java absolut genauso...
Schön und gut, nur ist es ziemlich gefährlich, wenn ein Operator, je nach Cast, unterschiedlich reagiert.
 

TheJavaKid

Top Contributor
Roar hat gesagt.:
Hi, hab zwar keine ahnung von C# bin aber pro-googler ....

rofl XD

an den vergleichen zu java ud c# code wird mal wieder klar wie sehr microsoft sich mühe gegeben hat die sprache EIGEN zumachen, ich mein zwischen

@Override

und

public override ...

is doch ein riesen unterschied oder :p
 

Illuvatar

Top Contributor
Nur mal so:

a) C# ("override") war vor Java5 ("@Override")

b) override hat eine total andere Funktion als @Override. Das in Java ist nur eine Annotation, die dem (nicht unbedingt menschlichen) Leser sagt, dass da was überschrieben werden soll. Das in C# ist ein Schlüsselwort, das bedeutet, dass die virtuelle Methode überschrieben werden soll. Das gabs auch schon in C++, Delphi u.v.m., und - welch Wunder - es hieß da auch meistens irgendwas like override.

Ach ja, @SnooP: Was soll da in Java genauso sein? Da kann man keine Operatoren überladen - und in Java macht es eigentlich nie einen Unterschied ob man in Object castet, oder nicht...
 

TheJavaKid

Top Contributor
Illuvatar hat gesagt.:
Nur mal so:

a) C# ("override") war vor Java5 ("@Override")

b) override hat eine total andere Funktion als @Override. Das in Java ist nur eine Annotation, die dem (nicht unbedingt menschlichen) Leser sagt, dass da was überschrieben werden soll. Das in C# ist ein Schlüsselwort, das bedeutet, dass die virtuelle Methode überschrieben werden soll. Das gabs auch schon in C++, Delphi u.v.m., und - welch Wunder - es hieß da auch meistens irgendwas like override.

Ach ja, @SnooP: Was soll da in Java genauso sein? Da kann man keine Operatoren überladen - und in Java macht es eigentlich nie einen Unterschied ob man in Object castet, oder nicht...

lol, mein post sollte eigentlich nur ein scherz sein :D

weil mi das grade so eingefalln is, ka warum, zu viel cola getrunken wahrscheinlich :cool:
 

byte

Top Contributor
Was meinst Du denn damit? Wenn man eine Methode überlädt, dann ändert sich doch die Methodensignatur. Wenn ich dann nach Object caste, ist die überladene Methode doch gar nicht mehr sichtbar. Und bei überschriebenen Methoden ist es halt wie Illuvatar schon sagte egal, ob ich zu ner Vaterklasse hochcaste oder nicht, das ändert ja nichts daran, dass trotzdem die überschriebene Implementierung der Methode verwendet wird.
 
B

Beni

Gast
Wenn du 2 Methoden hast:
Code:
public void doSomething( Object o ){
  ...
}

public void doSomething( String s ){
  ...
}

Dann benötigst du einen Cast um die obere aufzurufen, wenn du eine String-Referenz besitzt:
Code:
String bla = "abc";

// hier werden verschiedene Methoden aufgerufen
doSomething( bla );
doSomething( (Object)bla );
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C SOLID Single Responsibility Priciple Frage Softwareentwicklung 2
K Frage OOP Softwareentwicklung 8
dgtKotlin Frage zu Kotlin source code Softwareentwicklung 5
A Frage zu testdriven developement Softwareentwicklung 1
H Regex Frage Softwareentwicklung 2
D Frage Schichtenarchitektur Softwareentwicklung 3
T Frage bezüglich MVC Softwareentwicklung 1
Shams Frage wegen guava-Eventbus. Softwareentwicklung 0
B Frage zu Schnittstellen (lose Kopplung) Softwareentwicklung 5
H Frage zur Stanford NLP-API Softwareentwicklung 2
E Frage zu Dekorator-Pattern Softwareentwicklung 2
O Frage zu Regulärer Ausdruck Softwareentwicklung 3
H WEKA - Frage zu Methode in Evaluation Softwareentwicklung 2
S Frage zu Zusicherungen: Softwareentwicklung 12
D Frage zu String Algorithmen / String Metric Softwareentwicklung 7
Airwolf89 Theoretische Frage - In Java Java-Programme schreiben Softwareentwicklung 5
D Frage zur Objektorientierung mit Interfaces Softwareentwicklung 9
B Theoretische Informatik Frage zu Formalismus RegExp Softwareentwicklung 12
Wepster LGPL, MPL Frage Softwareentwicklung 3
D Frage zur Benutzeroberflächenprogrammierung Softwareentwicklung 8
D Frage zu Klassendiagramm und Konstruktor (UML) Softwareentwicklung 3
M [OOP] Frage zu Methode-Namen / Funktionsweise Softwareentwicklung 9
P Frage zu Processing Softwareentwicklung 9
S Regex Frage Softwareentwicklung 4
D Frage zu meiner Vorgehensweise in einem Projekt Softwareentwicklung 5
A Frage zu GPL Softwareentwicklung 3
K Frage zu UML Aktivitätsdiagramm Softwareentwicklung 3
J Frage zu Lizenzrechten Softwareentwicklung 5
B bash frage Softwareentwicklung 6
F allgemeine exe frage Softwareentwicklung 10
G Frage zur LGPL? Softwareentwicklung 5
0x7F800000 "Wozu ist denn CSS / CSS2 gut" Dumme Frage? Softwareentwicklung 9
G Frage zur UML Softwareentwicklung 2
B Ajax Frage Softwareentwicklung 2
J Frage zu Relation Softwareentwicklung 2
W Frage zu a)Innere Klassen und b)OO Design Softwareentwicklung 13
G MVC Frage Softwareentwicklung 4
P Frage zu Prolog! Softwareentwicklung 7
E Frage zu Excel und Filtern Softwareentwicklung 4
Y OpenGL/C Frage - externe Funktionen Softwareentwicklung 5
T SQL, Feld mehrmals abfragen, IN Frage Softwareentwicklung 3
C Grundsätzliche Frage zur OOP bzw. zum MVC Softwareentwicklung 5
RaoulDuke Frage zu Datenmodel / Zugriff Softwareentwicklung 5
J Frage zu C Softwareentwicklung 2
H Frage ueber Prototype Pattern? Softwareentwicklung 2
L Noch 'ne Perl-Frage. Kehre dann auch reumütig zu Java zurück Softwareentwicklung 10
S Design-Frage: Wie viele Fassaden? Softwareentwicklung 4
J Frage zu MVC, Swing, Gui Softwareentwicklung 3
L Frage zu Beziehungen zwischen Klassen und UML Softwareentwicklung 10
T Frage zu Mysql Softwareentwicklung 3
C Mysql-Frage(Problem mit nicht durchgeführten Zugriff) Softwareentwicklung 5

Ähnliche Java Themen

Neue Themen


Oben