Przerabiam przykład z książki. na podstawie tego co jest napisane w książce, stworzyłem program, który:
-tworzy instancję klasy zawierającej kilka tablic, każda składa się z kilku elementów
-tworzy instancję klasy Random i za jej pomocą wybiera losowy element z każdej tablicy
-przekazuje wylosowany element z każdej tablicy do stringa, w którym są one dodawane i wyświetlane w etykiecie
-etykiet jest kilka, zatem po uruchomieniu programu mam kilka zestawów losowo dobranych elementów
Program działa znakomicie i zgodnie z założeniami. Tyle, że nie rozumiem, po co tworzona jest instancja klasy zawierającej te tablice i chciałem sprawdzić, czy da się pominąć tę instrukcję (ponieważ uważam, że jest zbędna). Napisałem program i... w każdej etykiecie pojawiają mi się prawie za każdym razem takie same wartości, w sensie:
etykieta 1: aabbc
etykieta 2: aabbc
etykieta 3: aabbc
etykieta 4: aabbc
Wartości te zmieniają się np. na cbcab, ale w każdej etykiecie prawie zawsze się pokrywają. Czasem zadziała tak, że jedna z etykiet jest inna od reszty, ale zdarza się to rzadko. Ponieważ nie mogłem zrozumieć skąd się to bierze, to przepuściłem program przez debuggera i okazało się, że w debuggerze program działa prawidłowo! I tak jest za każdym razem. Program zachowuje się tak, jakby Random nie nadążał ze zmianą swoich wartości i przez to liczba odpowiedzialna za losowanie była taka sama dla każdego losowania.
To jest poprawnie działający kod tworzący instancję klasy MenuMaker (wg mnie niepotrzebnie)
kod klasy zawierającej tablice i metodę odpowiedzialną za losowanie
class MenuMaker
{
public Random Randomizer = new Random();
string[] Meats = { "Pieczona wołowina", "Salami", "Indyk", "Szynka", "Karkówka" };
string[] Condiments = {"żółta musztarda", "przyprawa", "brązowa musztarda",
"musztarda miodowa", "majonez", "sos francuski"};
string[] Breads = {"chleb ryżowy", "chleb biały", "chleb zbożowy", "pumpernikiel",
"chleb włoski", "bułka"};
public string GetMenuItem()
{
string randomMeat = Meats[Randomizer.Next(Meats.Length)];
string randomCondiments = Condiments[Randomizer.Next(Condiments.Length)];
string randomBreads = Breads[Randomizer.Next(Breads.Length)];
return randomMeat + ", " + randomCondiments + ", " + randomBreads + ".";
}
}
-to jest kod podpięty do przycisku tworzący zawartość etykiet
private void button1_Click(object sender, EventArgs e)
{
MenuMaker menu = new MenuMaker();
label1.Text = menu.GetMenuItem();
label2.Text = menu.GetMenuItem();
label3.Text = menu.GetMenuItem();
label4.Text = menu.GetMenuItem();
label5.Text = menu.GetMenuItem();
label6.Text = menu.GetMenuItem();
}
A to kod programu, który nie działa prawidłowo (poza debuggerem) - ma tę samą klasę MenuMaker, różni się tylko okodowaniem przycisku
private void button1_Click(object sender, EventArgs e)
{
label1.Text = MenuMaker.GetMenuItem();
label2.Text = MenuMaker.GetMenuItem();
label3.Text = MenuMaker.GetMenuItem();
label4.Text = MenuMaker.GetMenuItem();
label5.Text = MenuMaker.GetMenuItem();
label6.Text = MenuMaker.GetMenuItem();
}