Laden...

Wert ändert sich auch ohne ref

Erstellt von bluedragon vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.054 Views
B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren
Wert ändert sich auch ohne ref

[EDIT]Abgeteilt von [Artikel] C# und Übergabemechanismen: call by value vs. call by reference (ref/out)[/EDIT]

Hallo ich schliesse mich tecla an und muss sagen, dass ich das Thema auch sehr interessant finde.
Leider verstehe ich nur eine einzige Sache nicht:
Wieso wird hier 6 ausgeben ? Die Methode ist doch nicht call by reference und wenn man eine Referenz übergibt wird doch nur eine Kopie erstellt. Aber wenn man die Kopie verändert, wieso wird dann hier auch die original Referenz verändert ?


using System;

class Auto
{
    public Auto(int AnzahlReifen)
    {
        m_AnzahlReifen = AnzahlReifen;
    }
    public int m_AnzahlReifen;
}

public class MyMain
{

    public static void Main()
    {
        Auto MeinAuto = new Auto(4);
        foo(MeinAuto);
        System.Console.WriteLine(MeinAuto.m_AnzahlReifen);  // gibt 6 aus
    }

    static void foo(Auto irgendeinAuto)
    {
        irgendeinAuto.m_AnzahlReifen = 6;
    }
}

Währe nett wenn mir das nochmal jemand erklären könnte, denn in dem Thema geht für mich keine schlüssige Begründung für die Ausgabe hervor 🙁

liebe Grüße
blue

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

871 Beiträge seit 2005
vor 15 Jahren

Hallo,

folgender Grund:* Du übergibst eine Instanz vom Typ "Auto" an die Methode "foo" - by Value. Dementsprechend ändert sich die Instanz selbst nicht beim Aufrufer wenn Du ihr ein neues Objekt vom Typ Auto zuweisen würdest (tust du auch nicht, nur der verständnis halber).

  • Du veränderst in der Methode "foo" die Public Variable "m_AnzahlReifen" innerhalb der übergebenen Instanz (ganz ordinäre Zuweisung)

Das eine (Ref/Value) hat in deinem Fall eigentlich nichts mit dem Ergebnis zu tun.

Grüsse,
Egon

/edit: Noch was:

Beim Call by Value wird eine Kopie der Referenz auf das eigentliche Objekt übergeben. Das Objekt selbst ("dereferenziertes Objekt") wird NICHT kopiert.

B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Danke für die schnelle Antwort, nur nochmal fürs Selbstverständniss:
Weil ich die public Variable der Kopie ändere, ändere ich auch den Wert der public Variable des originals, weil der Inhalt der Kopie nur ein Verweis zum Original ist ?
Oder bin ich immer noch zu doof dafür ? Kann sein, dass ich da was verwechsel, aber so stell ich mir das gerade vor 🙁

grüße
blue

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

C
489 Beiträge seit 2007
vor 15 Jahren

Hallo

Klassen sind bei c# Referenztypen und deshalb wird bei Übergabe einer Klasse und deren Bearbeitung eben auch das Original bearbeitet.

chrische

B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Ah danke, jetzt habe ichs verstanden =)

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.

4.221 Beiträge seit 2005
vor 15 Jahren

@bluedragon

Wer public Variablen verwendet hat das Prinzip der Kapselung nicht verstanden... und sollte mal ein gutes Buch lesen !!

Diese sind (meine Ansicht und auch die der meistn Entwickler) Zeichen eines schlechten Programmierstyles.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

B
bluedragon Themenstarter:in
101 Beiträge seit 2008
vor 15 Jahren

Ich weiß, ich selbst mache es auch anders, wollte das Thema aber trotzdem gerne verstehen 😉 Ist ja nicht verboten oda ^^

*EDIT*
und wie herbivore schon sagte, er selbst wüsste für das Beispiel auch keine Sinnvolle Kapselung !

Man muss viel gelernt haben, um nach etwas, worüber man nicht Bescheid weiß, richtig fragen zu können.

Wenn du jemandem vertrauen kannst, erübrigt sich ein Vertrag. Kannst du ihm nicht vertrauen, ist ein Vertrag nutzlos.