none
Klasse erhält Referenz?

    Frage

  • Hallo,

    ich habe eine Klasse Person mit den Eigenschaften Name und Vorname

    Nun erstelle ich Zwei Objekte :

    Dim Person1 as new Person with {.Name = Mustemann,.Vorname = max} 

    Dim Person2 as new Person

    nun Übergebe ich die Werte von Person1 an Person2

    Person2 = Person1

    Wenn ich nun Werte an Person1 ändere, ändern sich diese Werte auch an Person1

    Person2.Vorname = Klaus

    dann ist Person1.Vorname = Klaus

    Person1 soll aber unabhängig von Person2 bleiben also keine Referenz auf Person1.

    Was mach ich hier falsch ?

    Danke für die Hilfe und ein schönes Wochenende

    Freitag, 9. August 2013 09:40

Antworten

  • Hallo Daniel,

    du übergibst die Speicherreferenz der Klasse Person1 in die Variable Person2. In beiden Variablen steht dann die Referenz auf das gleiche Objekt im Speicher.

    Du könntest schreiben:

    Person2.Vorname = Person1.Vorname
    Person2.Name = Person1.Name

    Wenn du die Person duplizieren willst solltest du dir vielleicht das Interface ICloneable anschauen.

    http://msdn.microsoft.com/de-de/library/vstudio/system.icloneable.aspx

    Über die Methode MemberwiseClone() kannst du ein Objekt clonen. Die Eigenschaften werden also übernommen, es ist aber ein neues Personenobjekt.

    Gruß

    Maik

    --

    Maik Hanns - http://blog.maikhanns.de

    MCT, MCPD, MCSD

    Schulungen von ppedv - http://ppedv.de

    • Als Antwort markiert Daniel, Freitag, 9. August 2013 14:43
    Freitag, 9. August 2013 09:58
  • Hallo Daniel,

    wie Maik schon geschrieben hat, übergibst Du lediglich eine Referenz auf das Objekt "Person1". Damit ist Person2 identisch mit Person1 und nicht eine Kopie davon.

    Wenn Du das so haben möchtest, müsstest Du eine neue Instanz erstellen und die Werte kopieren. Oft macht man das über sogenanntes klonen, hierzu wirst Du bspw. auf Methoden wie Clone() stoßen. Siehe bspw.:

      http://stackoverflow.com/questions/78536/deep-cloning-objects-in-c-sharp

    Wenn Du kein komplexes Objekt hast, sondern nur eine "flache Klasse" mit ein paar Eigenschaften, die als Wertetyp angelegt sind, reicht auch eine flache Kopie, bspw. per MemberwiseClone, siehe dazu:

      http://msdn.microsoft.com/de-de/library/system.object.memberwiseclone.aspx

    Ich für meinen Teil verwende in der Regel eine Methode, die ein Objekt serialisiert und eine neue Instanz wieder deserialisiert zurückgibt. (Ist im ersten Link beschrieben). Damit kann man so gut wie alle Objekte klonen, auch mit sehr komplexen Strukturen. Die Performance ist natürlich nicht die allerbeste, wenn man das aber eh nur an einigen Stellen und nicht für x tausende Objekte gleichzeitig machen muss, stört das nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Daniel, Freitag, 9. August 2013 14:43
    Freitag, 9. August 2013 10:37
  • Hallo, meine Vorredner haben bereits erklärt warum das so ist, ich möchte dich in diesem Zusammenhang noch auf Strukturen hinweisen. Diese verhalten sich bei deinem Problem nehmlich so wie du es dir Vorstellst.
    Structure Person
        Property Name As String
        Property Vorname As String
    End Structure
    Strukturen sind Werttypen, genauso wie Double oder Integer. Wenn du einem Objekt nun ein anderes Zuweist, dann werden alle Werte "kopiert".


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Daniel, Freitag, 9. August 2013 14:43
    Freitag, 9. August 2013 14:10

Alle Antworten

  • Hallo Daniel,

    du übergibst die Speicherreferenz der Klasse Person1 in die Variable Person2. In beiden Variablen steht dann die Referenz auf das gleiche Objekt im Speicher.

    Du könntest schreiben:

    Person2.Vorname = Person1.Vorname
    Person2.Name = Person1.Name

    Wenn du die Person duplizieren willst solltest du dir vielleicht das Interface ICloneable anschauen.

    http://msdn.microsoft.com/de-de/library/vstudio/system.icloneable.aspx

    Über die Methode MemberwiseClone() kannst du ein Objekt clonen. Die Eigenschaften werden also übernommen, es ist aber ein neues Personenobjekt.

    Gruß

    Maik

    --

    Maik Hanns - http://blog.maikhanns.de

    MCT, MCPD, MCSD

    Schulungen von ppedv - http://ppedv.de

    • Als Antwort markiert Daniel, Freitag, 9. August 2013 14:43
    Freitag, 9. August 2013 09:58
  • Hallo Daniel,

    wie Maik schon geschrieben hat, übergibst Du lediglich eine Referenz auf das Objekt "Person1". Damit ist Person2 identisch mit Person1 und nicht eine Kopie davon.

    Wenn Du das so haben möchtest, müsstest Du eine neue Instanz erstellen und die Werte kopieren. Oft macht man das über sogenanntes klonen, hierzu wirst Du bspw. auf Methoden wie Clone() stoßen. Siehe bspw.:

      http://stackoverflow.com/questions/78536/deep-cloning-objects-in-c-sharp

    Wenn Du kein komplexes Objekt hast, sondern nur eine "flache Klasse" mit ein paar Eigenschaften, die als Wertetyp angelegt sind, reicht auch eine flache Kopie, bspw. per MemberwiseClone, siehe dazu:

      http://msdn.microsoft.com/de-de/library/system.object.memberwiseclone.aspx

    Ich für meinen Teil verwende in der Regel eine Methode, die ein Objekt serialisiert und eine neue Instanz wieder deserialisiert zurückgibt. (Ist im ersten Link beschrieben). Damit kann man so gut wie alle Objekte klonen, auch mit sehr komplexen Strukturen. Die Performance ist natürlich nicht die allerbeste, wenn man das aber eh nur an einigen Stellen und nicht für x tausende Objekte gleichzeitig machen muss, stört das nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Daniel, Freitag, 9. August 2013 14:43
    Freitag, 9. August 2013 10:37
  • Hallo, meine Vorredner haben bereits erklärt warum das so ist, ich möchte dich in diesem Zusammenhang noch auf Strukturen hinweisen. Diese verhalten sich bei deinem Problem nehmlich so wie du es dir Vorstellst.
    Structure Person
        Property Name As String
        Property Vorname As String
    End Structure
    Strukturen sind Werttypen, genauso wie Double oder Integer. Wenn du einem Objekt nun ein anderes Zuweist, dann werden alle Werte "kopiert".


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Daniel, Freitag, 9. August 2013 14:43
    Freitag, 9. August 2013 14:10
  • Danke Jungs...

    Werde mir mal das MemberwiseClone anschauen...

    Gruß Daniel

    Freitag, 9. August 2013 14:44