Forum: PC-Programmierung C# - by reference / by value an Funktion?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mathias _. (mathias1988)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe die ersten Schritte in C# gewagt und bereits eine Frage bzgl. 
der Übergabe von Objekten an Funktionen.

Ändere ich eine Variable eines Objektes innerhalb einer Funktion, so 
wird die Änderung im Objekt abgespeichert. In C "Ohne sharp" 
funktioniert das ja nur, wenn ein Objekt "by reference" also mit Pointer 
an die Funktion übergeben wird.

Jetzt bin ich etwas verwirrt. Wird bei C# ein Objekt nun standardmäßig 
"by reference" oder "by value" an die Funktion übergeben. In der 
Literatur konnte ich "by value" als default nachlesen. Wäre super, wenn 
mir bei dieser Anfängerfrage jemand weiterhilft, wie denn die 
Zusammenhänge sind.

Hier mal ein Beispiel:

namespace UserLoginSystem
{
    class Program
    {
        static void Main(string[] args)
        {
            Human Mathias = new Human();
            Mathias.surename = "Maier";
            Mathias.age = 18;
            Console.WriteLine(Mathias.surename + " age:" + Mathias.age);
            changeHumanName(Mathias, "Wimmer",22);
            Console.WriteLine(Mathias.surename + " age:" + Mathias.age);
            Console.ReadKey();
        }

        static void changeHumanName(Human human,string newname, int 
newage)
        {
            human.surename = newname;
            human.age = newage;
        }
    }

    class Human
    {
        public string surename;
        public int age;
    }
}

von Tilo R. (joey5337) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Bei Objekten in C# (und Java) steht in der entsprechenden Variable eine 
Referenz auf das entsprechende Objekt. (Das irgendwo im verwalteten 
Arbeitsspeicher rumliegt, was dich aber nichts angeht.)

Insofern entspricht die Übergabe eines Objekts der C-Denke "by 
reference", weil der Wert der Objektreferenz übergeben wird.

von cppbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Objects immer als Referenz
Structs immer als Value

von re (Gast)


Bewertung
0 lesenswert
nicht lesenswert
In C# ist das bei Objekten standardmäßig "by reference", bei nativen 
Datentypen (int, double, ...) "by-value".

Für "by-value" würde ein Copy-Construktor benötigt werden (wie in C++ ja 
auch) - und damit tut sich C# afaik etwas schwerer als C++ (korrigiert 
mich, wenn ich mit dieser Ve4rmutung falshcliege)

Leider inkonsistent und umständlich, wenn man native Datentypen 
"by-reference" übergeben will.

(re)

von Mathias _. (mathias1988)


Bewertung
0 lesenswert
nicht lesenswert
Jetzt wart ihr aber alle schnell :) . Danke für eure Antworten. Dann 
werde ich das mit den nativen Datentypen (int , double ...) auch mal 
ausprobieren. Das heißt, wenn ich diese Datentypen an eine Funktion 
übergebe und darin die variable verändern will muss ich "ref" 
vorranstellen ?

Danke für eure Antworten, es hat mir auf alle Fälle schon geholfen :)

: Bearbeitet durch User
von cppbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mathias _. schrieb:
> Jetzt wart ihr aber alle schnell :) . Danke für eure Antworten.
> Dann
> werde ich das mit den nativen Datentypen (int , double ...) auch mal
> ausprobieren. Das heißt, wenn ich diese Datentypen an eine Funktion
> übergebe und darin die variable verändern will muss ich "ref"
> vorranstellen ?
>
> Danke für eure Antworten, es hat mir auf alle Fälle schon geholfen :)

out oder inout

von re (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mathias _. schrieb:
> die Frage, war um es "by referenence" in C# gibt ?

Bei komplexen Objekten macht was anderes eigeentlich auch nur selten 
Sinn, genauso wie man in C++ sowas auch fast immer "by reference" 
übergibt.


> Ich kann einem Objekt bei der Übergabe ja auch ein "ref" voranstellen..

Das kommt z.B. bei Structs zum tragen, die sonst "by value" übergeben 
werden würden.

von Tilo R. (joey5337) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Vielleicht noch ein paar zusätzliche Hinweise:
Das ist nicht so schlecht wie es sich anhört, weil Referenzen ja viel 
kleiner sind als das tatsächliche Objekt im Speicher. Das geht also 
schneller. Und man spart trotzdem das ganze gepointere, referenzieren 
und dereferenzieren.

Trotzdem ergibt sich damit das Problem, dass, sobald du ein Objekt 
irgendjemandem gegeben hast, der das auch ändern kann. Da hilft kein 
const :-)

Wenn sowas ungünstig ist, gibt es 2 Muster, die dagegen helfen:

1. (das Beste) sind immutable-Objekte. Das sind Objekte, deren Member 
alle final sind, d.h. da kann man nichts mehr verändern.

2. Copy-Konstruktoren, dann kann man sein eigenes Objekt behalten.
Ähnlich macht man es, wenn ein immutable-Objekt (wie z.B. string) doch 
bearbeitet werden muss: darum liefert z.B. die ToUpper-Methode einen 
neuen string, statt das existierende Objekt zu verändern.

von Mathias _. (mathias1988)


Bewertung
0 lesenswert
nicht lesenswert
Hab es gerade mit "ref int number" für die Übergabe als Referenz 
ausprobiert und es funktioniert feuerwerk :). Ich bin da aus der 
C-Programmierung noch getauft von der Pointerrei und mir ist wichtig zu 
verstehen, wie die Dinge hier bei C# ablaufen. Danke allen für die 
Unterstützung, jetzt kann ich mich weiter reinarbeiten :).

Gruß,
Mathias

von h4x0r (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Mathias _. schrieb:
> ich habe die ersten Schritte in C# gewagt

Mein Freund, du bist auf dem falschen Pfad! Kehre um und wähle den 
richtigen Weg (C++). Noch ist es nicht zu spät.

von WS (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Quatsch, immer diese Arroganz der sogenannten C und C++ Kenner.
Sind nicht in der Lage über ihren Tellerrand zu schauen.

von h4x0r (Gast)


Bewertung
0 lesenswert
nicht lesenswert
WS schrieb:
> Quatsch, immer diese Arroganz der sogenannten C und C++ Kenner.

Lieber WS, auch du wirst irgendwann den Irrweg erkennen auf dem du 
wandelst. Du hast dich von einem Dämon und seinen falschen Versprechen 
leiten lassen. Wende dich von ihm ab und kehre zu uns zurück.

von Jens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
h4x0r schrieb:
> Lieber WS, auch du wirst irgendwann den Irrweg erkennen auf dem du
> wandelst. Du hast dich von einem Dämon und seinen falschen Versprechen
> leiten lassen. Wende dich von ihm ab und kehre zu uns zurück.

Zurück in deine Höhle, Troll!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.