Элемент из массива не дублируется

108
06 марта 2021, 13:10

Я создал класс:

public class Figure
{
    public Point [] Cordinates { get; set; }
    public Figure(Point[] Cordinates)
    {
        this.Cordinates = Cordinates;
    }
}

Также сделал массив:

 private static Figure[] _figureArray = new Figure[5]
 {
     new Figure(new Point[] {
         new Point(0, 0), new Point(1, 0),
         new Point(2, 0), new Point(3, 0)
     },
        ... //Дальше описанны остальные элементы массива
 };

Далее я создаю переменную и присваиваю ей элемент массива:

 Figure CurrentFigure = _figureArray[0];

Если я меняю свойство у данной переменной:

 CurrentFigure.Cordinates[0].X = 1;

То свойство меняется и у элементов массива.

Скажите пожалуйста, как это исправить?

Answer 1

У меня получилось реализовать клонирование таким образом

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Drawing;
namespace Rextester
{
    public class Program
    {
        public class Figure
        {
            public Point [] Cordinates { get; set; }
            public Figure(Point[] Cordinates)
            {
                this.Cordinates = Cordinates;
            }
            public Figure Clone()
            {
                Figure other = (Figure) this.MemberwiseClone();
                other.Cordinates = new Point[this.Cordinates.Length];
                for (int i=0; i<this.Cordinates.Length; i++){
                    other.Cordinates[i] = new Point(this.Cordinates[i].X,this.Cordinates[i].Y);
                }
                return other;
            }
        }
        private static Figure[] _figureArray = new Figure[2]
            {
             new Figure(new Point[] {
                 new Point(0, 0), new Point(1, 0),
                 new Point(2, 0), new Point(3, 0)
             }),
             new Figure(new Point[] {
                 new Point(0, 0), new Point(1, 0),
                 new Point(2, 0), new Point(3, 0)
             })
            };
        public static void Main(string[] args)
        {
            Figure CurrentFigure = _figureArray[0].Clone();
            CurrentFigure.Cordinates[0].X = 12;
            Console.WriteLine("{0:G}",_figureArray[0].Cordinates[0].X);
            Console.WriteLine("{0:G}",CurrentFigure.Cordinates[0].X);
        }
    }
}
Answer 2

Реализуй метод Клон:

class Figure: ICloneable
{
    public Figure Clone()
    {
        return this.MemberwiseClone();
    }
}

и в нужном месте:

Figure CurrentFigure = _figureArray[0].Clone();

Это случилось по той причине, что автор вопроса не понимает разницы между референс типом и значимым типом данных. Советую почитать об этом детальнее т.к. это важная часть программирования на шарпе.

READ ALSO
SQL фильтрация дубликатов

SQL фильтрация дубликатов

Вопрос заключается в следующем : Есть база данных postgre, в ней есть таблица вот такого вида Из за сбоя в службе которая собирает статистику...

107
Есть ли альтернатива питоновского типа enumerate в php?

Есть ли альтернатива питоновского типа enumerate в php?

В PHP новичок от слова совсем, появилась задача написать генератор случайных чисел с идентификаторами, в питоне например про такой тип, как...

120
PHP universal delete file

PHP universal delete file

Какие могут быть недостатки у кода ниже ?

90
Как обработать Javascript-объект (невалидный JSON) в PHP?

Как обработать Javascript-объект (невалидный JSON) в PHP?

Возникла проблема - API отдаёт данные в JSON формате, примерно в таком виде:

90