list widoczna w metodach

0

witam

dopiero rozpoczolem przygode z C# wiec prosze o wyrozumialosc :) poszukiwalem co nieco w necie na ten temat ale ze slabym efektem. a wiem ze dla was to bedzie banal, na ktory poswiecicie nie wiecej niz minute :] wiec bede wdzieczny za pomoc

a chodzi mi o to aby zadeklarowac liste. ma byc ona widoczna we wszystkich metodach i klasach przestrzeni public partial class Form1 : Form. cos jak obiekt globalny w C++

0

ma byc ona widoczna we wszystkich metodach i klasach przestrzeni public partial class Form1 : Form

Hmm, musisz jeszcze trochę poczytać o C#.

public partial class Form1 : Form nie jest przestrzenią nazw (namespace) tylko deklaracją klasy - publiczna klasa Form1 która dziedziczy po Form. Partial oznacza, że klasa może być zdefiniowana w kilku plikach (gdzie w twoim przypadku są to pliki cs i designer.cs)

Zatem, jeśli ma być widoczna tylko w tej klasie Form1, to wystarczy zwykłe pole prywatne.

public partial class Form1 : Form{
    List<int> MojaLista;

}

MojaLista będzie widoczna w całym Form1 (ale nie poza nią!)

0

Masz racje Deti - rozumiem że jest to klasa.

Teraz sprecyzuje moje pytanie :) Chcę żeby do tej listy był bezpośredni dostęp z poziomu innych klas.
I tak dla przykładu: dodaje do projektu klasę Obiekt a w niej metodę DodajElement ktora bedzie dodawała elementy do lMojaLista
Intuicyjnie, zakladam że lista jest widziana w tej klasie więc defincja Obiektu wyglada nastepujaco:

public class Obiekt {
    public void DodajElemnet(){
        MojaList.Add(5);
   }
}

Czy takie bezposrednie odwolanie sie do Listy da się zrealizować? Wiem że jednym z możliwych rozwiązań jest przekazanie referencyjne Listy w konstruktorze klasy Obiekt. Zastanawiam się jednak, czy nie jakiegos innego rozwiązania tego problemu. Z listy tej bedzie korzystało wiele klas, więc to chyba nie jest dobre rozwiazanie przekazywanie jej do kazdej z tych klas.

I pytanie pomocnicze: podczas referencji, mowia po chłopsku, powstaje nazwa ktora wskazuje na pamiec obiektu? Obiekt nie jest kopiowany, czyli nie jest zajmowana dodatkowa pamięć tak jak w przypadku przekazywania bez ref?</i>

0

Masz racje Deti - rozumiem że jest to klasa.

Teraz sprecyzuje moje pytanie :) Chcę żeby do tej listy był bezpośredni dostęp z poziomu innych klas.
I tak dla przykładu: dodaje do projektu klasę Obiekt a w niej metodę DodajElement ktora bedzie dodawała elementy do lMojaLista
Intuicyjnie, zakladam że lista jest widziana w tej klasie więc defincja Obiektu wyglada nastepujaco:

public class Obiekt {
public void DodajElemnet(){
MojaList.Add(5);
}
}

Czy takie bezposrednie odwolanie sie do Listy da się zrealizować? Wiem że jednym z możliwych rozwiązań jest przekazanie referencyjne Listy w konstruktorze klasy Obiekt. Zastanawiam się jednak, czy nie jakiegos innego rozwiązania tego problemu. Z listy tej bedzie korzystało wiele klas, więc to chyba nie jest dobre rozwiazanie przekazywanie jej do kazdej z tych klas.

Trzeba tu rozważyć 2 aspekty:

  1. Z czyste technicznego punktu widzenia - jest to jak najbardziej możliwe. O tym za chwilę.
  2. Z punktu widzenia OOP - koszmar. Lepiej będzie enkapsulować wybrane elementy klasy - np. tą listę.

Co do pytania : Twoja forma jest budowana w pliku Program.cs - tam powinieneś zajrzeć. Zobacz co robi metoda Main():

Application.Run(new Form1());

Możesz sobie ten kod zmodyfikować - np. dodać tu twoją listę (w końcu nie musi być ona koniecznie w definicji formy.

Twoją listę możesz też zadeklarować w formie jako public static - (chyba, że będziesz tworzył wiele! instancji twojej klasy Form1 - ale w to wątpię. W takim wypadku Lista byłaby wspólna dla wszystkich form - i dla całej aplikacji oczywiście).

I

pytanie pomocnicze: podczas referencji, mowia po chłopsku, powstaje nazwa ktora wskazuje na pamiec obiektu? Obiekt nie jest kopiowany, czyli nie jest zajmowana dodatkowa pamięć tak jak w przypadku przekazywania bez ref?

Trochę tu pomyliłeś. W C# są 2 rodzaje typów - proste (Value type) i "referencyjne" (Reference Type). Oba przypadki różną się gdy mówimy o przekazywaniu do funkcji przez ref.

W twoim przypadku Forma jest klasą więc Reference Type - gdybyś przekazał taki obiekt do funkcji przez ref forma, przekazał byś sam wskaźnik. Gdyby teraz w funkcji nastąpiło:

forma=null;

.. stracił byś ten obiekt bezpowrotnie (chyba, że istniałyby inne zmienne, które wskazują na obiekt formy - wtedy Garbage Collector nie usunął by jej ze sterty).

.. ale się rozpisałem - temat jest niestety dość duży :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.