Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wert ändert sich auch ohne ref
bluedragon
myCSharp.de - Member



Dabei seit:
Beiträge: 104
Herkunft: Nordrheinwestfalen

Themenstarter:

Wert ändert sich auch ohne ref

beantworten | zitieren | melden

[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.
private Nachricht | Beiträge des Benutzers
egrath
myCSharp.de - Member

Avatar #avatar-2119.jpg


Dabei seit:
Beiträge: 937
Herkunft: Österreich / Steyr

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von egrath am .
private Nachricht | Beiträge des Benutzers
bluedragon
myCSharp.de - Member



Dabei seit:
Beiträge: 104
Herkunft: Nordrheinwestfalen

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
chrische5
myCSharp.de - Member



Dabei seit:
Beiträge: 503
Herkunft: Europa

beantworten | zitieren | melden

Hallo

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

chrische
private Nachricht | Beiträge des Benutzers
bluedragon
myCSharp.de - Member



Dabei seit:
Beiträge: 104
Herkunft: Nordrheinwestfalen

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

@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...
private Nachricht | Beiträge des Benutzers
bluedragon
myCSharp.de - Member



Dabei seit:
Beiträge: 104
Herkunft: Nordrheinwestfalen

Themenstarter:

beantworten | zitieren | melden

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 !
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von bluedragon am .
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.
private Nachricht | Beiträge des Benutzers