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
Unterschiedliche Methoden, gleiches Ergebnis (Entscheidungshilfe)
Skydanith
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

Unterschiedliche Methoden, gleiches Ergebnis (Entscheidungshilfe)

beantworten | zitieren | melden

Hallo,

aktuell absolviere ich ein Video-Tutorial.

Bei einer Aufgabe ging es darum, dass eine Begrüßung mit meinem Namen ausgegeben wird.

Ich konnte die Aufgabe lösen, allerdings auf einen anderen Weg wie der Dozent.

Was mich jetzt interessieren würde wäre, welche Methode Ihr besser findet.
Ich schreibe mal nicht dazu, welche von mir ist sondern nur Methode 1 & 2.

Methode 1:


   class Program
    {
        static void Main(string[] args)
        {
            Begrüßung("Daniel");
            Console.ReadKey();

        }
        static string Begrüßung(string name)
        {
            string name1 = name;
            Console.WriteLine("Hallo " + name1 + "! Wie geht es dir heute?");

            return name1;

        }
     


Methode 2


   class Program
    {
        static void Main(string[] args)
        {
         
            Console.WriteLine(Begrüßung("Daniel"));

       
            Console.ReadKey();
        }

      
        static string Begrüßung(string name)
        {
      
            return "Hallo " + name + ". Wie geht es dir?";
        }


Danke im Voraus
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Skydanith am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7581
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Skydanith,

es kommt darauf an was die Methode "Begrüßung" konzeptionell machen soll:
  • auf der Konsole die Begrüßung mit Namen ausgeben -> Methode 1
  • den Begrüßungs-Text erstellen und zurückgeben -> Methode 2, allerdings wäre dann ein Name wie "ErzeugeBegrüßungsText" passender

Demnach wohl eher Methode 1 als passender.

Die Methode 1 kann aber auch einfacher geschrieben werden.


        static string Begrüßung(string name)
        {
            Console.WriteLine($"Hallo {name}! Wie geht es dir heute?");

            return name;

        }
Wobei hier ein Rückgabewert eher überflüssig ist und die Methode void sein sollte.


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Skydanith
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Hallo gfoidl,

es freut mich zu lesen, da Methode 1 auf meinem Mist gewachsen ist.

Vom Grundsatz ging es aber nur darum, was Methoden sind und wie/wo man sie einsetzt.

Danke noch für den Vorschlag. Das verkürzt das ganze nochmal zusätzlich.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16232

beantworten | zitieren | melden

Auch wenn es Visual Studio und der Compiler kann: bitte vermeide Sonderzeichen in Methodennamen.
Andere Editoren und Co können das nämlich nicht unbedingt, und dann knallt es.

Noch besser: englische Bezeichnungen.

[Artikel] C#: Richtlinien für die Namensvergabe
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7581
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Skydanith,
Zitat
was Methoden sind und wie/wo man sie einsetzt.
Methoden sind ein Konzept der objektorientierten Programmierung (OOP). Sie sind ähnlich einem Funktionsaufruf, aber dennoch nicht damit zu verwechseln. Ein Methodenaufruf ist das Senden einer Nachricht an ein Objekt und die Implementierung einer Methode ist die Vorschrift, wie ein Objekt auf ein solche Nachricht zu reagieren hat.

Nehmen wir z.B. ein Objekt "Motor" her, so kann dieses Objekt die Methode "Starten" haben. Wird nun die Nachricht "Starten" and das Objekt "Motor" gesendet, so wird der Motor durch die entsprechende Implentierung der Methode gestartet. Wie das genau passiert kann dem Sender der Nachricht egal sein, denn das ist ein Implementierungsdetail von "Motor".

Schau dir für das Verständnis von Methoden am besten ganz allgemein die Grundlagen der OOP an (Identität, Zustand, Verhalten und Eigenschaften, Methoden).

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Skydanith
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Danke für die Tipps. An den Methoden sitze ich gerade.
Hab aber noch eine Verständnisfrage:

Im groben gibt es ja Methoden mit und ohne Rückgabewert.

Wenn ich aber einen String über eine Void Methode ausgeben lasse, ist es doch streng genommen auch ein Rückgabewert, oder?
private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1044
Herkunft: Mainz

beantworten | zitieren | melden

Hi,

nein - eine Ausgabe hat nichts mit der Rückgabe zu tun vom Konzept.

Bei der Rückgabe will ja der Aufrufer irgendwas zurück haben - bei der Ausgabe interessiert es den Aufrufer nicht was dort genau passiert, solange es nur passiert.

Die selbe Methode würde ja im Fall eine Desktop-Anwendung irgendwas auf den Bildschirm malen - das ist und bleibt dem Aufrufer hier allerdings egal.

LG
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7581
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Skydanith,

bleib gedanklich beim Senden einer Nachricht an ein Objekt.

Willst du eine Antwort auf die Nachricht haben -> Rückgabewert.
Willst du keine Antwort und nur dass etwas entsprechend Nachricht passiert -> void

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Skydanith
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Ok.

Also quasi wie eine leblose Hülle die nur was darstellt aber keine Substanz hat.

Bei einer Methode mit Rückgabe wert, findet ein Prozess statt. Beispielsweise eine Multiplikation die in der Methode berechnet werden soll und das Ergebnis ausgegeben werden soll.

Danke.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Skydanith am .
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Ein bisschen spät, aber mal ein anderer Gedankengang:

Ich finde Methode 1 deutlich schlechter, und zwar, weil "von außen", also in der Main-Methode, nicht erkennbar ist, dass Console-Output generiert werden wird. Nach dem Prinzip der geringsten Überraschung bevorzuge ich daher ganz klar Methode 2. Mit einer besseren Benennung wiederum werden die Vor- und Nachteile diesbezüglich allerdings nahezu aufgehoben. Ich würde vorschlagen:

Methode 1: PrintWelcomeText(string username)
Methode 2: GetWelcomeText(string username)

LaTino
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7581
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Skydanith,
Zitat
wie eine leblose Hülle die nur was darstellt aber keine Substanz hat.
Würde ich so nicht sagen. Am Beispiel Motor oben ist die void-Methode Starten die Nachricht. Dir, als Sender der Nachricht, ist nur wie wichtig dass der Motor dann gestartet ist (od. per Fehlermeldung quittiert). Wie der Start passiert ist dir egal bzw. kann dir egal sein -- das ist das Schöne an OOP, dass du die Details vom Motor nicht kennen musst.


public class Motor
{
    public void Starten() 
    {
        // ...
    }
}

Ein Auto könnte z.B. folgende Methode haben:


public class Auto
{
    private readonly Motor _motor;
    private double _istGeschwindigkeit;

    public Auto(Motor motor) => _motor = motor;

    public double Beschleunige(double sollGeschwindigkeit)
    {
        _motor.GasGeben(...);

        return _istGeschwindigkeit;
    }
}
Hier wird beim Beschleunigen der Sollwert vorgegeben und der Istwert zurückgegeben, da dieser ja durchaus interessant ist (für das regeln vom Auto).

In beiden Fällen ist es keine leblose Hülle, sondern bei void ist kein Rückgabewert interessant, daher gibt es auch keinen.


PS: LaTino hat da schon recht, anhand der Bezeichner soll sofort klar sein worum es geht.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
OlafSt
myCSharp.de - Member



Dabei seit:
Beiträge: 76
Herkunft: HH

beantworten | zitieren | melden

Besseres Beispiel:

Eine Methode mit Rückgabewert ist wie die Freundin, die man anbrüllt. Die brüllt was zurück.

Eine void-Methode ist die Katze: Die kann man zwar auch anbrüllen, aber die Katze schaut nur gelangweilt bis verwirrt. Zurück kommt aber akustisch nix.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von OlafSt am .
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

Sorry für Off-Topic: you made my day! :D
private Nachricht | Beiträge des Benutzers
Skydanith
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für die ganzen antworten. Dass mit dem Motor und der Freundin war ein gutes Beispiel.
Ich hab es auf jedenfalls verstanden. In dem Tutorial war das vielleicht auch nur ein blödes Beispiel um es zu veranschaulichen.



Muss glatt einen Sekt rausholen und einen ausgeben.
Zum ersten mal wurde der Threadtitel eines Threads den ich erstellt habe NICHT abgeändert.
8)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Skydanith am .
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2143

beantworten | zitieren | melden

Worauf komischerweise keiner eingegangen ist...


            string name1 = name;
Warum denn das?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7581
Herkunft: Waidring

beantworten | zitieren | melden

Hallo chilic,
Zitat
komischerweise keiner eingegangen ist...
naja, siehe mein Beispiel oben, da fehlt das schon (und das mit Absicht und der Hoffnung dass der OT das bemerkt).

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Skydanith
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Äh.. Ja. Die Zeile ist überflüssig.

Demnach ist auch der Inhalt des printbefehls falsch.

Hab es schon geändert.

Das stammt noch aus der Zeit, als ich kein Bewusstsein dafür hatte.
private Nachricht | Beiträge des Benutzers