Referencja się odcina

0

Witam.
Mam coś co powinno działać a nie działa. Poniżej dość jasny kod:

namespace Perceptron
{
    public partial class MainWindow : Form
    {
        private List<TeachingPattern> teachingPatterns;

        
        public MainWindow()
        {
            ...
        }
//najpierw ta funkcja się wywołuje z kliknięcia
        private void manageTP_Click(object sender, EventArgs e)//jak widać to jest obsługa klikacza
        {
            TeachingPatternsGUI tpgui = new TeachingPatternsGUI(ref teachingPatterns);
            <b>teachingPatterns.ToString();</b>
        }
    }
}
//oraz druga klasa:
namespace Perceptron
{
    internal partial class TeachingPatternsGUI : Form
    {
        private List<TeachingPattern> teachingPatterns;
//później ta:
        public TeachingPatternsGUI(ref List<TeachingPattern> teachingPatterns)
        {
            this.teachingPatterns = teachingPatterns;
//jeżeli jest tak to w pogrubionej linii jest null pointer co jest ok
            teachingPatterns = null;
//a jeżeli tak to niestety nie ma powyżej null pointer czyli ta operacja nie wpływa na przekazaną //referencję i to mnie denerwuje. Jeżeli nie przekazuję parametru przez ref to nie działa ani powyższa //linia ani poniższa
            this.teachingPatterns = null;
              ...
        }
    }
}

Wiecie gdzie jest krzak?

0
kaloshStudent napisał(a)
            this.teachingPatterns = teachingPatterns;

przypisanie kopiuje referencję, dlatego operacja bezpośrednio na referencji przekazanej przez referencję działa tak jak chcesz, a na jej kopii nie powoduje żądanego efektu.

0

To jak mam napisać tę klasę żeby this.teachingPatterns = teachingPatterns; przypisało mi referencję do pola klasy a nie jej kopię?

0

o ile dobrze pamietam, nie da rady. w .NET nie ma czegos takeigo jak referencja-na-, czyli nie ma odpowiednika C++'owego typ& zmienna; napisanie w parametrze 'ref' co prawda sie tak zachowuje, ale nie ma mozliwosci zrobienia pola w kalsie ktore by bylo 'ref'

klasa TeachingPatternsGUI bedzie musiala trzymac zmienna w stylu MainWindow form; i w konstruktorze bedzie musiala pobierac obiekt owego okna i sobie go w niej zapamietywac. a w momentach w ktorych bedzie potrzebowac wyzerowac tamto pole bedzie robic form.teachingPatterns = null; - i bedziesz musial zadbac o to zeby to pole bylo dostepne z zewnatrz jakos.

0
kaloshStudent napisał(a)

To jak mam napisać tę klasę żeby this.teachingPatterns = teachingPatterns; przypisało mi referencję do pola klasy a nie jej kopię?

Może się mylę, ale chyba nie da się takiego efektu (nullowania) osiągnąć w taki sposób, jak napisałeś.

Jeśli chodzi Ci o efekt (operowanie na składowych klasy) - możesz przekazywać do klasy Test referencję do obiektu formularza i na nim nullować referencję do listy (po zmianie jej modyfikatora); można to też robić naokoło uzywając mechanizmu refleksji; jeśli chodzi o "akademicki przykład" - nie wiem czy da się obejść domyślny mechanizm kopiujący przy przypisywaniu wartość źródłowej do docelowej referencji.

0

kopia..

0
quetzalcoatl napisał(a)

kopia..

zacząłem pisać przed Twoją odpowiedzią

0

Może spróbuj za pomocą wskaźników to zrobić, tylko wtedy kod musiałby być unsafe.

0

To c#, tam nie ma wskaznikow...

0

W C# są wskaźniki, ale można ich używać tylko w blokach nienadzorowanych czyli unsafe.

0

A fucktycznie, moj blad.

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