Einfache Frage zu C#: Übergabe von Werten an Funktionen

Coolsys

Enthusiast
Thread Starter
Mitglied seit
17.09.2004
Beiträge
3.489
Ort
Schleswig-Holstein
Hallo!
Ich hoffe es gibt hier jemanden, der mir schnell und einfach sagen kann, wie ich Funktionswerte richtig übergebe. Es geht hierbei nur um C#, nicht C++ oder ähnliches.

Meine Struktur sieht so aus:

Unterfunktion1
Unterfunktion2
Unterfunktion3
Unterfunktion4
Unterfunktion5
main
rufe _Unterfunktion1
rufe _Unterfunktion2

Und nun habe ich mir gedacht, dass Unterfunktion 1 einen Wert an main zurückgeben soll und _Unterfunktion2 diesen Wert aufnimmt und verarbeitet, dabei geht es um 2 Zahlen (integer).

Konkretes Beispiel:
Main ruft Additionsfunktion auf, dieses soll an main Zahl1 und Zahl2 zurückgeben. Nun soll nach der Additionsfunktion eine Subtraktionsfunktion Zahl1 und Zahl2 aufnehmen und verarbeiten.

Ich habe probiert zum Ende der Additionsfunktion return Zahl1; und return Zahl2; zu schreiben und _Unterfunktion(int Zahl1, int Zahl2)
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Verstehe ich nicht, ist CallByRefereceOut eine spezielle C# Funktion?
Ich bin übrigens Anfänger in C#

schon das "private" macht meinem Programm Kopfzerbrechen:
expected unqualified-id before "private"

und out wird auch nciht speziell markiert, scheint also nicht bekannt
 
Zuletzt bearbeitet:
Funktionen geben i.d.R. nur einen Wert zurück. Um aber mehrere Werte zurückgeben zu können muss in der Parameterliste der aufzurufenden Funktion weitere Rückgabeparamter angegeben werden.

Mit in, out und ref kannst du anscheinend steuern in welche Richtung die Parameter genutzt werden können.
http://msdn.microsoft.com/de-de/library/ee332485.aspx


(habe selber keine Erfahung mit C#, nur C++)
 
Hoi,

in ist an der Stelle irrelevant, mit out und ref führt man Referenzübergabe bei primitiven Datentypen durch. Es gibt prinzipiell ja primitive Datentypen und Referenztypen, also im Endeffekt Objekte. Letztere werden immer per Referenz übergeben, das Verhalten lässt sich mit ref und out auch bei Primitiven (z.B. Integern) herbeiführen.

Mehrfaches return geht natürlich nicht. Willst du jetzt Unterfunktion1 aus Main aufrufen udn zwei werte zurückgeben, so könntest du z.B. sowas machen:

Code:
public void Unterfunktion(int eingabe1, int eingabe 2, ref int ausgabe1, ref int ausgabe2)
{
 // Hier passiert was und ausgabe1 und ausgabe2 werden mit Werten belegt
}

und das in der main dann in etwa so aufrufen:

Code:
public static void main(string[] args)
{

int a = 0; 
int b = 0;

Unterfunktion(1,2,ref a, ref b);

// Jetzt stehen in a und b die Werte mit denen sie in Unterfunktion1 belegt wurden. Danach könntest du mit diesen beiden Zahlen z.B. eine zweite Funktion aufrufen.

}

Der Unterschied zwischen ref und out ist übrigens, dass bei "out" die Variable in der Funktion initialisiert wird (bzw. werden muss), bei "ref" wird sie außerhalb initialisiert.

Alternativ kannst du dir, wenn du mehr als einen Wert übergeben willst, natürlich immer eine passende Klasse in Struct definieren. Das mache ich persönlich lieber als out oder ref, auch wenn es mehr "overhead" darstellt.

Also z.B. definierst du dir

Code:
struct MeineDaten
{
   private int daten1;
   private int daten2;
   
   public int Daten1
   {
      get{return daten1;}
      set{daten1=value;}
   }

   public int Daten2
   {
      get{return daten2;}
      set{daten2=value;}
   }

}

und nutzt die Funktionen dann in etwa so

Code:
public MeineDaten Unterfunktion(int eingabe1, int eingabe2);
{
   // Hier passiert was, also eine MeineDaten Instanz wird erzeugt, mit Werten belegt und return
   MeineDaten daten = new MeineDaten();
   a.Daten1 = 1;
   a.Daten2 = 2;

   return daten;
}

und das in der main dann in etwa so aufrufen:

Code:
public static void main(string[] args)
{

MeineDaten daten = Unterfunktion(1,2);

// Jetzt könntest du daten an eine andere Funktion übergeben.

}
 
Zuletzt bearbeitet:
Geschmacksache würd' ich behaupten. Mir gefällt sowas nicht, ich schreibe gerne so, dass man Methoden ohne Architekturwissen benutzen kann. Bei nem Array geht das m.E. verloren, auch wenn man es in die Kommentare stopfen kann. ;)
 
Code:
public MeineDaten Unterfunktion(int eingabe1, int eingabe2);
{
   // Hier passiert was, also eine MeineDaten Instanz wird erzeugt, mit Werten belegt und return
   MeineDaten daten = new MeineDaten();
   a.Daten1 = 1;
   a.Daten2 = 2;

   return daten;
}

Kleiner Schönheitsfehler: a ist nicht definiert. Da hätte daten.Daten1 bzw 2 stehen müssen.
 
McGizmo - wow! Vielen dank! Ich wusste gar nicht dass man Strukturen auch verschachteln kann.

An alle anderen Beteiligten auch vielen Dank.

Heute habe ich gehört, dass man mit Zeigern selbiges erreichen kann, allerdings dann bei den Adressen aufpassen muss, da man mit C# im System rumspielen kann.

Ich hab noch viel zu lernen :d.
 
Kleiner Schönheitsfehler: a ist nicht definiert. Da hätte daten.Daten1 bzw 2 stehen müssen.

Passiert wenn man Zeug ohne Refactoring umbenennt. :d

---------- Beitrag hinzugefügt um 21:48 ---------- Vorheriger Beitrag war um 21:47 ----------

McGizmo - wow! Vielen dank! Ich wusste gar nicht dass man Strukturen auch verschachteln kann.

An alle anderen Beteiligten auch vielen Dank.

Heute habe ich gehört, dass man mit Zeigern selbiges erreichen kann, allerdings dann bei den Adressen aufpassen muss, da man mit C# im System rumspielen kann.

Ich hab noch viel zu lernen :d.

Pointer sind in C# nur als unsafe code möglich. Brauchst du im Endeffekt nie, würde ich erstmal vergessen. Haben in C# m.E. nichts mehr verloren.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh