2017-02-04 4 views
2

Я пытаюсь скопировать часть массива в другое место. Вот объявление.Путаница о массивах

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

Когда я делаю это,

ALLOBJECTS[1]= ALLOBJECTS[0]; 

Любые изменения, сделанные в одной либо вызвать изменение в другой.

От этого я понимаю, что он устанавливает указатели на тот же адрес (какой «копирование», но не то, что я хочу).

Как скопировать память, хранящуюся в указателе ALLOBJECTS [0], в ALLOBJECTS [1]?

Вещи пробовал:

  • Array.Copy() (все еще копировали указатели ...)
  • Использование оператора разыменования (Не работает ...)
+0

Я думаю, что это то, что вы хотите https://msdn.microsoft.com/en-us/library/aa288474(v=vs.71).aspx – MistyK

+1

, если вам действительно нужно работать с концепцией указателей в C#, есть способ с "небезопасным" кодом. В противном случае то, что вы хотите, называется глубокой копией или клоном. Найдите ICloneable, MemberwiseClone, Object.Clone. – dlatikay

+0

Возможный дубликат [Как сделать глубокую копию массива?] (Http://stackoverflow.com/questions/4054075/how-to-make-a-deep-copy-of-an-array) – jjj

ответ

3

Вы нужен конструктор копирования или сделать ObjectBasicFeatures структурой (struct является тип значения, тогда как класс является ссылочным типом) Тогда вы могли бы написать:

ALLOBJECTS [1] = new ObjectBasicFea Tures (AllObjects [0]);

Другой пример:

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 

} 

Надеется, что это помогает.

Если ObjectBasicFeatures класса имеет сложные свойства, которые вы должны рассмотреть глубокую функцию копирования

1

Для достижения этой цели необходимо создать конструктор, который принимает входной сигнал в качестве объекта и копирует его значение. Но вот улов. Вы должны сделать то же самое для всех классов, которые вы указываете в классе ObjectBasicFeatures, и так далее до листового узла. Ниже приведен фрагмент кода, который я тестировал.

пожалуйста, нет значение элемента (прямой член класса) не отражает в другой (скопированной) элемента, но значение level2.member обновляется в обоих объектов при изменении его в одном объекте

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; 
    } 
} 

Выход это будет выглядеть, как показано ниже

enter image description here