NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!

Diskuze – Lekce 4 - Hrací kostka v C# - Zapouzdření a konstruktor

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Čech:14.2.2016 14:25

Random bere jako seed čas, takže když několikrát za sebou třeba v cyklu zavoláš

new Random().Next();

vyjde ti vždy stejné číslo.
Však si to zkus...

Odpovědět
14.2.2016 14:25
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:14.2.2016 15:46
foreach (var item in Enumerable.Range(0, 10))
{
    Console.WriteLine(new Random().Next());
    Thread.Sleep(100);
}

Tvoje požadavky to splňuje a přesto to dává jiné čísla :/

 
Odpovědět
14.2.2016 15:46
Avatar
Odpovídá na Petr Čech
Richard Brzokoupil:14.2.2016 15:47

nejsem si jistej jestli jsi jsem se vyjádřil správně, já nechápu proč v této části kódu :

public Kostka()
{
        pocetSten = 6;
        random = new Random();
}

musí být "random = new Random();", přece s ní nijak nepracuji, tak k čemu tam je?
Druhá otázka: kdyby v konstruktoru chyběl "random = new Random();" byla by funkčnost stejná ? a jestli ne tak proč ?
děkuji za osvětlení :)

 
Odpovědět
14.2.2016 15:47
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Richard Brzokoupil
Jan Vargovský:14.2.2016 15:51

Je to prostě proměnná třídy, která je využívána skrz tu celou instanci. Je zbytečné jí vytvářet pro každé další číslo té sekvence znova. Navíc by ti nastala ta situace, že když to generuješ často po sobě, tak chytneš ten samý seed a vezmeš si z toho jen první prvek a pak takle dokola, dokud se nezmění ten seed toho randomu (v této implementaci jen dokud se nezmění čas).

 
Odpovědět
14.2.2016 15:51
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Richard Brzokoupil
Petr Čech:14.2.2016 16:21

Tak si to zkus. Dostaneš NullReference­Exception. Jde o to, že Random není to samé jako random. Random je třída kdežto random je proměnná. Když ji neinicializuješ, tj "random = new Random();" bude mít výchozí hodnotu null. Pokud ti to není jasné ani teď, projdi si prostě další návody, časem ti to dojde ;-)

Odpovědět
14.2.2016 16:21
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Čech:14.2.2016 16:22

Protože tam je Thread.Sleep(); s tím jsem samozřejmě nepočítal. Když to dáš pryč, vyjdou stejná čísla.

Odpovědět
14.2.2016 16:22
the cake is a lie
Avatar
Odpovídá na Petr Čech
Richard Brzokoupil:14.2.2016 16:41

Dobře bobře tak díky :)

 
Odpovědět
14.2.2016 16:41
Avatar
Honza.G
Člen
Avatar
Honza.G:17.5.2016 11:49

Zdravím, chci se zeptat, mohl by mi někdo popsat tento kus kodu podrobně prosím?

public override string ToString()
{
        return String.Format("Kostka s {0} stěnami", pocetSten);
}

Předem dík :)

 
Odpovědět
17.5.2016 11:49
Avatar
Odpovídá na Honza.G
Štěpán Wünsch:17.5.2016 13:17

Čemu přesně nerozumíš? Myslím že je to tu popsáno dost podrobně.

Každý objekt má metodu ToString(), která vrací textovou reprezentaci. Když napíšeš

Kostka kostka = new Kostka();
Console.WriteLine(kostka);

Výstup bude: NazevProjektu­.Kostka

Console.WriteLine(kostka);

se automaticky převede na

Console.WriteLine(kostka.ToString());

Většinou chceš, aby se vypsalo něco přirozenějšího.

public override string ToString()
{
        return String.Format("Kostka s {0} stěnami", pocetSten);
}

Tento kód znamená, že přepíšeš (klíčové slovo override) onu výchozí metodu svou vlastní. V metodě vrátíš string (text, který chceš aby se zobrazil).

return String.Format("Kostka s {0} stěnami", pocetSten);

je to samé jako

return "Kostka s " + pocetSten + " stěnami";

je to samé jako

return "Kostka s " + pocetSten.ToString() + " stěnami";

Nicméně String.Format (= string.Format) je přehlednější. Hlavně, pokud vypisuješ více hodnot.

 
Odpovědět
+2
17.5.2016 13:17
Avatar
Odpovídá na Honza.G
Michal Štěpánek:17.5.2016 13:42

A v poslední verzi C# můžeš napsat

public override string ToString()
{
        return String.Format($"Kostka s {pocetSten} stěnami");
}

a vypíše to to samé...

Odpovědět
+2
17.5.2016 13:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 154.