C# "void" und ein paar allgemeine fragen zu Funktionen

freakhouse

Ensign
Dabei seit
Okt. 2005
Beiträge
150
Hallo zusammen,
ich habe mal ein paar Fragen zu Funkionen aber ich poste erstmal den Quelltext.
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bitte geben Sie Wert A an");
            // Speichern von Wert A
            int a = Convert.ToInt16(Console.ReadLine());
            Console.WriteLine("Bitte geben Sie Wert B an");
            // Speichern von Wert B
            int b = Convert.ToInt16(Console.ReadLine());
            // Aufruf der Funktion zum Tauschen
            tausch(ref a,ref b);
            Console.WriteLine("a wurde in  {0} und b wurde in {1} geändert", a, b);
            Console.ReadKey();
        }
        static void tausch (ref int a,ref int b)
        {
            int temp1 = 0;
            int temp2 = 0;
            temp1 = a;
            temp2=b;
            b = temp1;
            a = temp2;
            temp1=0; temp2 = 0;


    }
    

    
    
        
    }
}
also ich habe, wie auch ersichtlich ein programm zum tauschen von werten geschrieben. nun aber zu den Fragen. "void" gibt ja keinen wert zurück oder der tausch wird nicht sichtbar, aber die funktion gibt die ergebnisse doch an tausch zurück? zweite frage ich habe hier die daten per reference an die funktion übergeben, darunter verstehe ich dass die werte welche in dem funktionsaufruf stehen auf die funktion verwiesen werden und nicht kopiert?! so wie bei call by value. kann mir vllt jmd die wichtigsten unterschiede sagen? ich habe bisher gedacht man könnte nur bestimmt datentypen mit call by reference übergeben. zum beispiel arrays. wird das durch den befehl "ref" aufgehoben? sorry für die dämlichen fragen aber im internet finde ich keine mir ersichtlichen antworten. also bitte für blöde erklären wenn es geht ;)
danke im voraus
 

toeffi

Lt. Junior Grade
Dabei seit
Feb. 2010
Beiträge
474
Naja zurückgegeben wird hier gar nicht. Da du, wie du schon richtig erkannt hast die Werte per Reference übergeben hast, werden in der Funktion die ORIGINALE bearbeitet und keine Kopien davon, was bei Call by Value gemacht wird. Im großen und ganzen hast du das was passiert schon richtig erklärt der einzige unterschied ist eben das einmal die Originalreference bearbeitet werden und bei Call by Value eben nur die Kopien des übergebenen. Per call bei Reference kannst du eigentlich alles übergeben. Wichtig bei dem ref Schlüsselwort ist jedoch, die Werte die übergeben werden müssen vorher intialisiert werden, was du ja auch gemacht hast. Im gegenzu dazu gibts noch das out Schlüsselwort, da müssen die Variablen nicht initialisiert werden vor der Übergabe. Soweit klar? Ansonsten Frag einfach weiter :p

edit: Natürlich macht es keinen Sinn Objekte von Klassen per Reference zu übergeben weil hier generell immer mit den Referenzen und somit die Originiale bearbeitet werden.
 

freakhouse

Ensign
Ersteller dieses Themas
Dabei seit
Okt. 2005
Beiträge
150
danke toeffi für die schnelle antwort ;)
dann bin ich schon mal schlauer, also werden alle daten die in der funktion sind auch in der main funktion verändert. was hat das denn fürn vorteil. spart man da speicher? oder wozu ist das gedacht?
 

toeffi

Lt. Junior Grade
Dabei seit
Feb. 2010
Beiträge
474
Das dient einfach dazu um primitive Datentype wie int,float usw gleich auf ihren Orignialen zu manipulieren. Und ja das kann Speichervorteile haben. Weil eben umgangen wird das eine zusätzliche Kopie erzeugt wird.
 

freakhouse

Ensign
Ersteller dieses Themas
Dabei seit
Okt. 2005
Beiträge
150
ok danke dann weiß ich soweit bescheid. wünsche dir schonmal 'nen schönen sonntag
 

kuddlmuddl

Commander
Dabei seit
Mai 2010
Beiträge
2.493
Stell dir mal vor, deine Funktion nimmt komplexere Objekte als int, die viel Speicher belegen. (Bilder, Videos...)
Da müsste dann bei jedem Funktionsaufruf das komplette Video kopiert werden, was natürlich unbenutzbar langsam wird.
Ich kenn jetzt C# nicht gut, aber ich vermute mal stark, dass es aus performance-Gründen bei primitiven Datentypen nix bringt statt einem int nur ne ref auf int zu übergeben, weil der pointer dann genau so viel Platz braucht wie die Daten an sich.

Ein Hinweis doch noch zu deiner "static void tausch (ref int a,ref int b)":

Ein Tausch von 2 Objekte braucht nicht 2 Puffer sondern nur einen. Klar ist das zum Programmieren lernen erstmal egal, aber evtl. interessant zu wissen:

Code:
static void tausch (ref int a,ref int b)
{
    int temp1 = a; // Der Wert von a geht nicht verloren, wenn wir gleich a überschreiben
    a = b;
    b = temp1;
}
 
C

claW.

Gast
damit kannst du auch mehrere rückgabewerte für eine funktion definieren. normalerweise gibts ja nur einen, wenn du aber nen pfad zerlegen willst in z.b. partition, pfad, dateiname, endung, größe, ... dann gäbe es die variante mit der rückgabe eines arrays oder die rückgabe über referenzen. schön zu sehen ist das in der winapi in c++, wo zeichenketten u.ä. gefüllt werden und als rückgabe kommt die anzahl an zeichen oder ob ein fehler auftritt oder nicht.
 
Top