Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 12. diel - Vlastnosti

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Placka03
Člen
Avatar
Placka03:12.4.2018 14:49

Existuje v C# něco jako funkce eval() v Java Scriptu? (funkce, do které zadáte kód a ona jej vykoná, např.

string prikaz = "WriteLine"
eval("Console." + prikaz + ".('ahoj')");

a výstup by byl 'ahoj').

Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na Placka03
pocitac770:12.4.2018 22:55

Říká se tomu reflexe, a je to hodně, hodně, hodně nečistý zacházení s jazykem, porušující kompletně veškeré bezpečností opatření OOP (alias jak se například dostat k a změnit privátní atribut), který by mělo být použito pouze v krajních případech... Na to se být tebou kouknu až budeš plně chápat aspekty onoho jazyka... (ani zde na to nejsou tutoriály)

Editované
Avatar
Odpovedá na Placka03
Michal Štěpánek:12.4.2018 22:57

A není jednodušší prostě napsat

Console.WriteLine("ahoj");

?

Odpovedať
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na pocitac770
pocitac770:12.4.2018 22:59

Hlavně je to taky kvůli tomu, že pokud si toto neohlídáš, tak desktopová aplikace napáchá více škody s uživatelsky spustitelným kódem, než webová. Pokud takto chceš vykonávat příkazy, tak to udělej například přes switch, kde podle zadaného výrazu spustíš nějakou z tebou vybraných metod

Avatar
Placka03
Člen
Avatar
Odpovedá na pocitac770
Placka03:13.4.2018 15:57

Ano, ale nevím, jak by se dal switch použít v tomto případě: vytvořím si třídu s funkcí například na změnění barvy pozadí konzole. Jejím parametrem bude string barva. Budu využívat ConsoleColors. Se switchem by to vypadalo asi takto:

class Trida
{
        public void ZmenPozadi(string barva)
        {
                switch(barva)
                {
                        case "Red":
                                Console.BackgroundColor = ConsoleColors.Red;
                        break;
                        case "Green":
                                Console.BackgroundColor = ConsoleColors.Green;
                        break;
// a ještě dalších spoustu řádků kódu, z nichž každé 3 řádky by znamenaly 1 barvu.

Pokud bych ovšem použil eval, vešlo by se mi to na pár řádků:

class Trida
{
        public void ZmenPozadi(string barva)
        {
                eval("Console.BackgroundColor = ConsoleColors." + barva + ";");
        }
}

Omlouvám se, pokud tam mám nějakou chybu. Psal jsem to teď z hlavy :)

Avatar
Dušan Kovářík:27.6.2018 5:11

Skvělý tutoriál! Musím přiznat, že vlastnosti se mi na C# velice líbí. Usnadňuje to spoustu psaní a přehlednost kódu. Docela by mě zajímalo, jestli něco podobného existuje v Javě, nebo se tam ke všemu musí psát přístupové metody?

Avatar
Odpovedá na Placka03
Erik Šťastný:27.6.2018 8:18

Pokud ti jde tak moc o počet řádku, tak můžeš změnit parametr metody takto:

class Trida
{
    public void ZmenPozadi(ConsoleColor color)
    {
        Console.BackgroundColor = color;
    }
}

Případně pokud trváš na parametru string, tak můžeš převést string na ten Enum.

ConsoleColor MyStatus = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), "Red", true);

Používat eval na takovou "pitomost" opravdu nedoporučuju :)

Editované
Avatar
Placka03
Člen
Avatar
Odpovedá na Erik Šťastný
Placka03:27.6.2018 15:11

Aha, moc děkuju. Udělat to takhle mě vůbec nenapadlo :-)

Avatar
Daniel Buchar:12.3.2019 20:38

Ahoj,

je nutne zapisovat do konstruktoru pres metodu EditujStudenta, nebo muzu nechat zapis hodnot pres konstruktor(viz nize)? Popripade jake to ma vyhody, nevyhody, kdyz mohu menit vlastnosti, teda krom toho ze zmenim vsechny vlastnosti v jedne metode?

class Student
{
public string Jmeno { get; private set; }
public bool Muz { get; set; }
public int vek;
public int Vek
{
get
{
return vek;
}
set
{
vek = value;
if (vek > 17)
Plnoletost = true;
else
Plnoletost = false;
}
}
public bool Plnoletost { get; private set; }

public Student(string Jmeno, bool Muz, int Vek)
{
this.Jmeno = Jmeno;
this.Muz = Muz;
this.vek = Vek;

}
public override string ToString()
{
string pohlavi = "muz";
if (!Muz)
pohlavi = "zena";
string plnoletosString = "plnolety";
if (!Plnoletost)
plnoletostString = "nejsem plnolety";
return string.Format("Jme­nuji se {0}, jsem {1}, je mi {2}let a {3}", Jmeno, pohlavi, Vek, plnoletostString);

}
}
}

Avatar
Martin Ben
Člen
Avatar
Martin Ben:16.7.2019 12:55

Ahoj, je nutné ukládat informaci o plnoletosti do interního atributu? nebylo by lepší ji v případě potřeby vypočítat?

public int Vek { get; set; }
public bool Plnolety
{
    get
    {
        return Vek >= 18;
    }
    private set { }
}
Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 99.