kzen.dev
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
 afaolek
afaolek
Question

Vytvorenie kópie objektu v jazyku C#

Možné duplikáty: [Ako urobiť hĺbkovú kópiu objektu v .Net (konkrétne v C#)?] (https://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically)

Pozrite si prosím nasledujúci kód (výňatok z knihy o jazyku C#):

public class MyClass 
{
    public int val;
}
public struct myStruct 
{
    public int val;
}
public class Program 
{
    private static void Main(string[] args) 
    {
        MyClass objectA = new MyClass();
        MyClass objectB = objectA;

        objectA.val = 10;
        objectB.val = 20;

        myStruct structA = new myStruct();
        myStruct structB = structA;

        structA.val = 30;
        structB.val = 40;

        Console.WriteLine("objectA.val = {0}", objectA.val);
        Console.WriteLine("objectB.val = {0}", objectB.val);
        Console.WriteLine("structA.val = {0}", structA.val);
        Console.WriteLine("structB.val = {0}", structB.val);

        Console.ReadKey();
    }
}

Chápem, že to vytvára nasledujúci výstup:

objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40

S poslednými dvoma riadkami výstupu nemám problém, ale prvé dva mi hovoria, že objectA a objectB ukazujú na ten istý blok pamäte (keďže v C# sú objekty referenčné typy).

Otázka znie, ako vytvoriť z objektuB kópiu objektuA tak, aby ukazovala na inú oblasť v pamäti. Chápem, že pokus o priradenie ich členov nemusí fungovať, pretože aj tieto členy môžu byť referenciami. Ako mám teda postupovať, aby objektB bol úplne inou entitou ako objektA?

Vďaka

150 2011-07-04T09:21:23+00:00 3
 AustinWBryan
AustinWBryan
Edited question 15 august 2019 в 3:10
Programovanie
cloning
c#
reference
object
This question has 1 odpoveď in English, to read them log in to your account.
 BugFinder
BugFinder
4 júl 2011 в 9:30
2011-07-04T09:30:12+00:00
Viac na
Zdroj
Upraviť
#12870314

Mohli by ste:

class myClass : ICloneable
{
    public String test;
    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

potom môžete urobiť

myClass a = new myClass();
myClass b = (myClass)a.Clone();

N.B. MemberwiseClone() Vytvorí plytkú kópiu aktuálneho System.Object.

 ono2012
ono2012
Edited answer 24 november 2017 в 4:06
129
0
Artificial intelligence to parse product page
productapi.dev
Solution / Answer
Henk Holterman
Henk Holterman
4 júl 2011 в 9:25
2011-07-04T09:25:07+00:00
Viac na
Zdroj
Upraviť
#12870312

Neexistuje žiadny zabudovaný spôsob. Trieda MyClass môže implementovať rozhranie IClonable (ale to je už zastarané) alebo si napísať vlastnú metódu Copy/Clone. V oboch prípadoch budete musieť napísať nejaký kód.

V prípade veľkých objektov by ste mohli zvážiť Serializáciu + Deserializáciu (prostredníctvom MemoryStream), len aby ste mohli opätovne použiť existujúci kód.

Bez ohľadu na metódu si dobre premyslite, čo presne znamená "kopírovanie". Ako hlboko by mala ísť, či existujú polia Id, ktoré sa majú vyňať atď.

Henk Holterman
Henk Holterman
Edited answer 25 október 2015 в 7:54
103
0
Artificial intelligence to parse product page
productapi.dev
 jgemedina
jgemedina
4 júl 2011 в 9:26
2011-07-04T09:26:54+00:00
Viac na
Zdroj
Upraviť
#12870313

Už je tu o tom otázka, možno by ste si ju mohli prečítať

https://stackoverflow.com/questions/78536/cloning-objects-in-c

V Jave napríklad neexistuje metóda Clone(), ale môžete do svojich tried zahrnúť konštruktor kopírovania, to je ďalší dobrý prístup.

class A
{
  private int attr

  public int Attr
  {
     get { return attr; }
     set { attr = value }
  }

  public A()
  {
  }

  public A(A p)
  {
     this.attr = p.Attr;
  }  
}

Toto by bol príklad, kopírovanie člena 'Attr' pri konštrukcii nového objektu.

 Community
Community
Edited answer 23 máj 2017 в 10:31
9
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Inessa bu
Registered pred mesiacom
2
Denis Babushkin
Registered pred mesiacom
3
asakuno asakuno
Registered pred mesiacom
4
aldo salerno
Registered pred mesiacom
5
Анна Батицкая
Registered pred mesiacom
Artificial intelligence to parse product page
productapi.dev
DE
EL
ES
FR
ID
IT
JA
NL
NO
PT
RO
RU
SK
TR
ZH
© kzen.dev 2023
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora