Jak zapobiec nadpisywaniu się wartości pól w klasie?

0

Witam
Mam pewien problem z polami w klasie, ponieważ tworzę operacje morfologiczne (w tym przypadku erozję) i wykorzystuje do tego macierz.

    class Erode
    {
        int[,] ImageMatrix { get; set; }
        int[,] TempMatrix { get; set; }
        int width;
        int height;

        public Erode(int[,] _ImgMatrix, int _width, int _height)
        {
            this.width = _width;
            this.height = _height;
            this.ImageMatrix = new int[width, height];
            this.ImageMatrix = _ImgMatrix;
        }

        public int[,] Eroding()
        {
            TempMatrix = new int[width, height];
            TempMatrix = ImageMatrix;
            
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    TempMatrix[i, j] = MinAdj(i, j);
                }
            }
            int a = ImageMatrix[5, 5];
            return TempMatrix;
        }

        public int MinAdj(int nCol, int nRow)
        {
            int min = ImageMatrix[nCol,nRow];
            for (int i = Math.Max(0, nCol - 1); i <= Math.Min(width - 1, nCol + 1); i++)
            {
                for (int j = Math.Max(0, nRow - 1); j <= Math.Min(height - 1, nRow + 1); j++)
                {
                    if ((nCol > 0 && nRow > 0) && (nCol < 4 && nRow < 4))
                    {
                        if (min > ImageMatrix[i, j])
                            min = ImageMatrix[i, j];
                    }
                    else
                    {
                        if (min > ImageMatrix[i, j])
                            min = ImageMatrix[i, j];
                    }
                }
            }

            return min;
        }

    } 

Klasa przyjmuje przez konstruktor przyjmuje macierz ImageMatrix o danej wysokości i szerokości i tu jest ok. Nie chcę, żeby ta macierz ulegała zmianie, więc utworzyłem macierz tymczasową TempMatrix, która na początku jest taka sama jak ImageMatrix ale ma się zmodyfikować i ma być zwrócona przez metodę Eroding(). Wszystko byłoby ok, gdyby macierz ImageMatrix nie ulegała zmianie.

Sprawdzałem debbugerem na linii:

            TempMatrix = ImageMatrix; oraz
             int a = ImageMatrix[5, 5]; //tymczasowo dodalem taka zmienna

i ImageMatrix z drugiej linii jest inna jak ta z pierwszej linii

Próbowałem też wpakować ImageMatrix do funkcji i zwracać ale też jej wartość się zmienia.

Nic do niej nie przypisuje, więc skąd zmieniają się wartości i jak temu zapobiec?

0
CRAG napisał(a):

Nic do niej nie przypisuje

Przypisujesz;) Tablice w c# sa typem referencyjnym (dziedziczą po klasie Array), wiec za kazdym razem jak piszesz:

TablicaTmp = TablicaSrc;

i potem zmieniasz TablicaTmp to automatycznie TablicaSrc tez sie zmieni. Dzieje sie tak dlatego, ze w pamieci jest to jeden i ten sam obiekt, ktory jest wskazywany przez dwie rozne referencje (TablicaTmp i TablicaSrc) - operator rownosci dla typow referencyjnych przepisuje tylko adres obiektu

0

dodatkowo takie operacje:

this.ImageMatrix = new int[width, height];
this.ImageMatrix = _ImgMatrix;

TempMatrix = new int[width, height];
TempMatrix = ImageMatrix;

są bezsensowne - najpierw tworzysz blok pamięci, a następnie natychmiast zapominasz o nim i zastępujesz inną zmienną
w języku bez garbage collectora miałbyś wyciek pamięci, ale na szczęście tutaj tylko niepotrzebnie marnujesz cykle i chwilowo pamięć

0

a odpowiedzią na pytanie jest skopiowanie tablicy

Array.Copy

0

Dzięki wielkie za pomoc :) już działa tak jak należy :)
Teraz już będę wiedział co zrobić jak będzie problem z tablicami.
po prostu nie spodziewałem się, że zmieniając jedną tablicę zmienia się też druga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1