2017-02-04 1 views
2

J'essaie de copier une partie d'un tableau vers un emplacement différent. Voici la déclaration.Confusion à propos des tableaux

public ObjectBasicFeatures[] ALLOBJECTS = new ObjectBasicFeatures[150]; 

Quand je fais cela,

ALLOBJECTS[1]= ALLOBJECTS[0]; 

Toute modification apportée à l'une provoque un changement dans l'autre. D'après ce que je comprends, il est le réglage des pointeurs à la même adresse (est 'copie', mais pas ce que je veux). Comment puis-je copier la mémoire stockée au pointeur ALLOBJECTS [0] vers ALLOBJECTS [1]?

choses ont essayé:

  • Array.Copy() (Toujours copier les pointeurs ...)
  • Utilisation de l'opérateur de déréférencement (Ça n'a pas marché ...)
+0

Je pense que c'est ce que vous voulez https://msdn.microsoft.com/en-us/library/aa288474(v=vs.71).aspx – MistyK

+1

si vous avez vraiment besoin de travailler avec le concept de pointeurs en C#, il y a un moyen avec du code 'unsafe'. Sinon, ce que vous voulez est appelé copie profonde ou clone. Recherchez ICloneable, MemberwiseClone, Object.Clone. – dlatikay

+0

Copie possible de [Comment faire une copie profonde d'un tableau?] (Http://stackoverflow.com/questions/4054075/how-to-make-a-deep-copy-of-an-array) – jjj

Répondre

3

Vous besoin d'un constructeur de copie ou make ObjectBasicFeatures un struct (struct est un type de valeur alors que class est un type de référence) Ensuite, vous pouvez écrire:

ALLOBJECTS [1] = new ObjetBasicFea tures (ALLOBJECTS [0]);

Un autre exemple:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var o1 = new ObjectBasicFeatures(); 
     var o2 = new ObjectBasicFeatures(o1); 
     System.Diagnostics.Debug.Assert(!o1.Equals(o2)); 

    } 
} 

public class ObjectBasicFeatures 
{ 
    public ObjectBasicFeatures() 
    { 
     MyProperty = 0; 
    } 

    /// <summary> 
    /// copy constructor 
    /// </summary> 
    /// <param name="other"></param> 
    public ObjectBasicFeatures(ObjectBasicFeatures other) 
    { 
     MyProperty = other.MyProperty; 
    } 

    public int MyProperty { get; set; } 
} 
0
ALLOBJECTS[1]= new ObjectBasicFeatures { 
     PropertyName1=ALLOBJECTS[0].PropertyName1 
     PropertyName2=ALLOBJECTS[0].PropertyName2 

} 

Hope this helps.

Si votre ObjectBasicFeatures de classe a des propriétés complexes, vous devriez considérer la fonction profonde de copie

1

Pour ce faire, vous devez créer un constructeur qui prend entrée comme son objet et ses valeurs copies. Mais voici une capture. Vous devez faire la même chose pour toutes les classes référencées dans la classe ObjectBasicFeatures et ainsi de suite jusqu'au nœud feuille. Voici un morceau de code que j'ai testé avec.

S'il vous plaît pas d'la valeur de membre (membre direct de classe) ne reflète pas dans d'autres (copié) élément, mais la valeur de level2.member est mis à jour dans les deux objets lorsque vous modifiez dans un objet

class Program 
{ 
    static void Main(string[] args) 
    { 
     ObjectBasicFeatures[] ALLOBJECTS = new ObjectBasicFeatures[3]; 
     ALLOBJECTS[0] = new ObjectBasicFeatures("zero"); 
     ALLOBJECTS[1] = new ObjectBasicFeatures("one"); 
     ALLOBJECTS[2] = new ObjectBasicFeatures("two"); 
     ALLOBJECTS[1] = new ObjectBasicFeatures(ALLOBJECTS[0]); 
     ALLOBJECTS[0].member = "Updated Value"; 
     ALLOBJECTS[0].level2Member.member = "Updated Level 2 Value"; 
     Console.WriteLine("At index 0 : " + ALLOBJECTS[0].member + ", Level2 : " + ALLOBJECTS[0].level2Member.member); 
     Console.WriteLine("At index 1 : " + ALLOBJECTS[1].member + ", Level2 : " + ALLOBJECTS[1].level2Member.member); 
     Console.ReadKey(); 
    } 
} 

public class ObjectBasicFeatures 
{ 
    public string member; 
    public Level2 level2Member; // This is to demonstrate that it will be updated in both the objects 
    public ObjectBasicFeatures(string memberVal) 
    { 
     member = memberVal; 
     level2Member = new Level2("Level 2 Value"); 
    } 

    /// Constructor to copy member values. 
    public ObjectBasicFeatures(ObjectBasicFeatures originalObject) 
    { 
     member = originalObject.member; 
     level2Member = originalObject.level2Member; 
    } 

} 

/// This class does not have a constructor to copy member values. 
public class Level2 
{ 
    public string member; 
    public Level2(string memberVal) 
    { 
     member = memberVal; 
    } 
} 

sortie de cela ressemblera ci-dessous

enter image description here