Thema: ?Methoden Datentypen angeben?
Hey Leute,
ich habe vor ca. 2 wochen mit c# begonnen, und komme bisher auch ganz gut mit der hilfe von google zurecht
nur kommt bei mir immer eine frage zu den methoden auf:
wenn ich void angebe, gibt die methode keinen rückgabewert zurück, wenn ich einen datentyp angebe muss ich den rückgabewert mithilfe des return befehls liefern. aber warum sollte ich denn überhaupt einen datentyp angeben? ich kann doch auch mit einer void methode arbeiten und diese benutzen und anwenden, wäre es nicht einfacher immer void zu nutzen ?
über aufklärende worte würde ich mich sehr freuen
und bitte beachtet das ich noch neu imm programmieren bin ich vertehe das fachchinesisch noch nicht soo gut
danke im vorraus MfG
Ben
Hallo,
es gibt Methoden mit Rückgabewerten und natürlich auch ohne, wobei dann als Rückgabeparameter void angegeben werden muss.
Methoden mit Rückgabewerten liefern, wie es der Name schon sagt, ein Objekt oder eine Variable zurück.
Folgendes Beispiel in einer Klasse:
![Quellcode ausblenden Quellcode ausblenden](templates/images/minus.gif)
Console.Writeline( plus( 2, 3 ) ); // Ausgabe 5 public int plus(int a, int b) { return (a + b); }
Ich bin mir auch nicht sicher was du meinst, aber vielleicht hilfts dir ja.
![:)](templates/images/smiles/smile.gif)
Gruß Jörg
Das weiß ich ja schon
mein "problem" ist nur, das ich der meinung bin das es doch immer besser ist eine void methode zu erstellen, weil man die ja trzdem voll benutzen kann.
und wenn man einen datentyp angibt, dann muss man den rückgabe wert immer selbst liefern, warum macht man sich die arbeit?
Da C der Großvater von C# ist, hat man das Funktionenkonzept von C übernommen, sozusagen vererbt. Funktionen/Methoden mit Rückgabewerten kannst du überall dort einsetzen, wo auch einfache Variablen stehen können. Das macht den Code einfacher. (s. Gustls Beispiel). Bei void-Funktionen/Methoden benötigt man Hilfsvariablen zum Datenaustausch, das ist ziemlich unelegant.
Servus,
das Konzept der Objektorientierung in die ja auch C# fällt sieht für Methoden vor, dass diese gekapselte Arbeitsschritte zum erreichen genau eines Ziels sind. Im Optimalfall nur immer wenige Codezeilen. Dadurch vereinfacht sich die Codewartung und Fehlersuche enorm und dieser ist auch leichter lesbar.
Im Beispiel einer Addition von 2 Integer:
![Quellcode ausblenden Quellcode ausblenden](templates/images/minus.gif)
public int addieren(int summand1, int summand2) { return summand1 + summand2; }
Diese Methode erfüllt genau einen Zweck - sie addiert 2 von dir übergebene Werte und liefert die Summe zurück. Wenn wir jetzt mal ganz wild sind und beispielsweise in unserem Programm statt der Addition eine Subtraktion wollen (Die Benennung lassen wir mal außen vor) dann muss ich lediglich dieses eine Rechenzeichen ändern und passe so die Funktionalität der Methode in sämtlichen Aufrufen an und muss im Optimalfall weiter nichts machen.
Selbstverständlich kann ich hier nicht sämtliche Konzepte der Objektorientierung und der Kapselung erläutern, aber ich hoffe dass ich es verständlich erklären konnte. Am besten versteht man so etwas immer in der Praxis. Besonders bei umfangreichen Projekten gewinnt z.B. Kapselung enorm an Bedeutung.
Viele Grüße
crankZ
Ich vermute, dass dein Problem ist, dass du Methoden als reine "Prozeduren" betrachtest, in denen xyz getan werden soll.
Eine Nicht-Statische Methode, das heißt eine Methode die einer Objektinstanz "gehört", mit Rückgabewert kannst du in den meisten Fällen betrachten wie eine Eigenschaft, deren Wert erst nach Ausführung der Methode feststeht.
Im folgenden Beispiel möchte ich veranschaulischen das z.B. der Getter einer Eigenschaft im grunde nichts anderes als eine Methode mit Rückgabewert ist und man ihn auf genau dieselbe Art verwenden kann.
Das Ergebnis "1" müsste natürlich durch dein errechnetes Ergebnis ersetzt werden.
![Quellcode ausblenden Quellcode ausblenden](templates/images/minus.gif)
// Eine sogenannte Klasse, also ein Objekttyp public class MyClass { // Der Konstruktor public MyClass() { } // Ein Member vom Typ System.Int32 public int NumerischeEigenschaft { get { // Tue etwas return 1; } set; } // Ein Member in Form einer Methode mit Rückgabewert vom Typ System.Int32 public int NumerischeMethode() { // Tue etwas return 1; } }
Eine weitere Möglichkeit Methoden mit Rückgabewert zu nutzen, wäre z.B. sich über Erfolg/Misserfolg oder ähnlichem zu informieren.
Siehe Bsp.:
![Quellcode ausblenden Quellcode ausblenden](templates/images/minus.gif)
public static bool MyMethod() { try // Versucht etwas { // Tue etwas return true; // Erfolg. } catch (Exception x) // Fängt eine Ausnahme in der Try-Anweisung ab. { MessageBox.Show(x.ToString()); // Zeige die unbehandelte Ausnahme in einem Fenster, wenn erwünscht. return false; // Misserfolg. } }
Ansonsten geht es dabei, wie crankZ schon beschrieben hat, vorwiegend um Kapselung.
Das bedeutet, dass du bestimmte Vorgänge von anderen Vorgängen des Programms "trennst", also kapselst.
Wenn ich eine Methode habe die einen Parameter erwartet, so kann ich mit diesem übergebenem Wert in meiner Methode anstellen was immer ich möchte,
der ursprüngliche Wert, den ich übergeben habe, also z.B. eine Variable, wird außerhalb meiner Methode NICHT beeinflusst.
Hierzu folgendes Bsp.:
![Quellcode ausblenden Quellcode ausblenden](templates/images/minus.gif)
static void Main(string[] args) { int MyInt = 10; Console.WriteLine(MyMethod(MyInt)); Console.WriteLine(MyInt); Console.Read(); } public static int MyMethod(int i) { i += 10; // i = i + 10; return i; }
Konsolenausgabe:
20
10
Wenn MyMethod in der Lage wäre die als Parameter übergebene Variable zu beeinflussen, wäre die Ausgabe von MyInt ebenfalls 20 gewesen.
Beachte aber : Dies gilt nur für übergebene Parameter. Wählst du in der Methode einfach Variablen außerhalb der Methode an, so wird sie sich auch tatsächlich verändern!
Es ist mit den Schlüsselwörtern ref und out sehr wohl möglich als Parameter übergebene Variablen per Referenz, also tatsächlich, zu verändern. Damit solltest du dich vorerst aber erstmal nicht weiter befassen.
![:)](templates/images/smiles/smile.gif)
Ich hoffe ich konnte dich weiterbringen und es war nicht zusehr "Fachchinesisch" für dich! (Y)
Viel Erfolg
![;)](templates/images/smiles/wink.gif)