Laden...

Was ist der Unterschied zw. Methode überladen und Optionalem Parameter?

Erstellt von CrocodileDundee vor 4 Jahren Letzter Beitrag vor 4 Jahren 944 Views
C
CrocodileDundee Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren
Was ist der Unterschied zw. Methode überladen und Optionalem Parameter?

Hallo zusammen,
ich glaube, ich habe noch nicht ganz verstanden, wann ich
bei unterschiedlichen Parameter einer Methode

  • die Methode überlade

public void DoSomething(long x) {}
public void DoSomething(long x, long y) {}

  • oder optionale Parameter

public void DoSomething(long x, long y = 0) {}

verwende.

Bei beiden Techniken muss ich die beiden Fälle abdecken, daß y verwendet wird oder nicht. Tatsächlich fällt es mir momentan schwer, mich für eine der beiden Techniken zu entscheiden.

Ein keiner Tipp wäre ganz hilfreich.

Vielen Dank und viele Grüße
Frank

5.657 Beiträge seit 2006
vor 4 Jahren

Wenn der Code der gleiche ist, dann sind optionale Parameter besser geeignet. Bei unterschiedlichem Code die Überladung.

Weeks of programming can save you hours of planning

656 Beiträge seit 2008
vor 4 Jahren

Zu beachten ist halt, dass ein Default-Parameter keine zweite Methode erzeugt, sondern effektiv nur die Methode mit x und y existiert.
An allen Stellen, wo nur das x übergeben wird, schreibt der Compiler fix den Standardwert (hier: 0) in den Aufruf rein.
Ist im gleichen Assembly wurscht, kann über Assembly-Grenzen hinweg aber bedeuten dass sich Aufrufe unterschiedlich verhalten können (wenn du beispielsweise den Standardwert änderst aber die aufrufenden Stellen nicht neu kompilierst; wo dann noch der alte Wert reingebacken ist...)

T
461 Beiträge seit 2013
vor 4 Jahren

Noch dazu:

Überladungen verwendet man auch oft um die Abwärtskompatibilität aufrecht zu erhalten, bei Erweiterungen oder dergleichen.

Das was @Bhaal sagt ist auch wichtig, ich denke ++noch ++dazu zu sagen:
Wenn du versuchst überladene Methoden zu ändern, indem sie stattdessen optionale Parameter aktzeptieren (oder umgekehrt) ist es eine Änderung der Methodenstruktur, mit dem fremde Assemblies, wenn sie nicht neu erstellt werden, nicht umgehen können, da sie die Methode auf einmal nicht mehr finden.

_MethodNotFoundException _heißt glaub ich das Zauberwort...

Da muß man aufpassen.

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄