NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 11 - Vlastnosti

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
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Martin Ben
Ondřej Štorc:16.7.2019 13:16

V tomto případě ano, ale šlo by to zapsat ještě lépe:

public int Vek { get; set; }
public bool Plnolety
{
    get
    {
        return Vek >= 18;
    }
}
// A ještě lépe jednou:
public int Vek { get; set; }
public bool Plnolety
{
    get => Vek >= 18;
}
// A nakonec i takto:
public bool Plnoletost => Vek >= 18;
Odpovědět
16.7.2019 13:16
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Martin Ben
Člen
Avatar
Martin Ben:16.7.2019 13:22

Hezké :-)
S C# teprve začínám, ale asi se mi bude líbit.

 
Odpovědět
16.7.2019 13:22
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Martin Ben
Martin Petrovaj:16.7.2019 14:39

Myslím, že autor článku nechcel hneď od začiatku navádzať začínajúcich programátorov k tomu, aby za vlastnosti schovávali nejakú komplexnú logiku.

Ak je to len jednoduché overenie podmienky proti jednej premennej, alebo napr. spočítanie dvoch iných premenných, tak zapísať to takto zmysel dáva. Akonáhle ale potrebuješ kódu viac (napr. zavolať nejakú vlastnú metódu, alebo napísať viac než 1 statement), tak na 99% niečo robíš zle.

V takom prípade máš 2 najbežnejšie možnosti: buď nepoužiješ vlastnosť, ale spravíš z toho kódu normálnu metódu, napr. GetPlnolety() (a používateľom tvojej triedy bude jasné, že tá metóda musí na pozadí vykonávať nejaké zložitejšie operácie - čo by pri použití vlastnosti programátor bežne neočakával), alebo môžeš hodnotu tejto vlastnosti cachovať, tak ako je to spravené v článku, a updatovať ju zakaždým keď je na to dôvod.

Odpovědět
16.7.2019 14:39
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
David
Člen
Avatar
David:16.4.2020 10:09

Díky za článek. ;-)

 
Odpovědět
16.4.2020 10:09
Avatar
Martin Riecky:23.8.2020 11:27

Predpokladám, že keď mám u vlastnosti uvedený iba getter, potom viem nastaviť vlastnosť iba v konštruktore. Neskoršia úprava vo vytvorej inštancii už nie je možná.

private List<Auto> auta = new List<Auto>();
public string ModelAuta { get; } // kompilátor na stránke vypíše chybu:
//    must have a body because it is not marked abstract or extern.
//    The property can be automatically implemented when you define both accessors
public int PocetAut { get => auta.Count; } // lamda výrazy mi neberie

Je to samotné uvedenie get; bez set; spôsobené iba obmedzeniami kompilátora v rámci stránky, alebo je to skôr vývojom .NET a VisualStudia?

 
Odpovědět
23.8.2020 11:27
Avatar
Martin McDermot Kuchta:26.12.2020 17:11

Mám dotaz ohledně vlastností pokud chci vytvořit vlastnost musí být vytvořen i její atribut ten s malým?
Příklad:

private int vek;

pokud chci getter např. bez setteru

public int Vek { get; private set; }

tady v článku je napsáno

Zprvu je nutné si vytvořit privátní atribut vek s malým písmenem, ve které bude hodnota ve skutečnosti uložena.

Bral jsem to jako dogma. Ale u příkladů k řešení v dalších lekcích (obchod s objednávkou) jsou ve třídě jen vlastnosti s velkým. A ne v jedné třídě ve všech to tak je.

public int Number { get; private set; }

či dokonce s návratorou hodnotou vlastnosti z jiné třídy?

get { return zakaznik.Jmeno; }

Což je velice matoucí, proto bych se chtěl zeptat, jak je to správně, protože v tom je pak hokey.
Díky

Editováno 26.12.2020 17:12
Odpovědět
26.12.2020 17:11
Everything is possible
Avatar
Václav Dachs:12.5.2021 23:55

Nebylo by elegantnější v metodě ToString() použít ternární výrazy:

public override string ToString() {
   string jsemPlnolety = (plnolety) ? "jsem" : "nejsem";
   string plnoletost = (Muz) ? "plnoletý" : "plnoletá";
   string pohlavi = (muz) ? "muž" : "žena";
   return ($"Jsem {jmeno}, {pohlavi}. Je mi {vek} let a {jsemPlnolety} {plnoletost}.");
}
Odpovědět
12.5.2021 23:55
S úsměvem jde všechno lépe :-)
Avatar
Jiří Pivec
Člen
Avatar
Odpovídá na Martin McDermot Kuchta
Jiří Pivec:15.11.2021 19:25

Ahoj, ještě předtím sis ale možná nevšiml tohoto:

Pokud si přejeme, aby se v getteru nebo setteru dělo více, než jen načtení/zápis hodnoty, můžeme si ho definovat ručně.

Potom kód může vypadat tak, jak je v článku uvedeno:

private int vek;
public int Vek
{
    get
    {
        return vek;
    }
    set
    {
        vek = value;
        // kontrola plnoletosti
        Plnolety = true;
        if (vek < 18)
            Plnolety = false;
    }
}

Když napíšeš:

public int Vek {get; private set;}

Potom platí toto:

C# ve skutečnosti vygeneruje privátní atribut a k němu dvě metody, které podle kontextu volá (pozná dle situace zda čteme nebo zapisujeme).

Takže vlastně C# udělá tohle:

private int vek;
public int Vek
{
    get
    {
        return vek;
    }
    private set
    {
        vek = value;
    }
}
Odpovědět
15.11.2021 19:25
„Kdo se umí smát sám sobě, má právo se smát všemu ostatnímu, co mu k smíchu připadá.“ J.W.
Avatar
Lukáš R.
Člen
Avatar
Lukáš R.:1.8.2022 14:55

Zdravím, mám otázku k init setterom, nastavujeme ich pri tvorbe inštancie objektu v zátvorkách "{}" napr.

Trieda trieda = new Trieda() {Vlastnost = 123}

Moja otázka znie, čo predstavujú tie zátvorky {} a pri akých situáciach sa používajú pri tvorbe inštancie?

A druha otázka: dokážeme sa zaobísť aj bez init setterov? (t.j. len s využitím konštruktorov)
Vďaka vopred

Editováno 1.8.2022 14:57
 
Odpovědět
1.8.2022 14:55
Avatar
Jaroslav Drobek:3.8.2022 19:43

Hodnocení:

  • Pokud si čtenář (podle doporučení) pojmenuje projekt "Vlastnosti", potom VS při vytvoření nové třídy pro ni automaticky zvolí jmenný prostor Vlastnosti; v ukázce kódu Program.cs je jmenný prostor OnlineApp, což může být příčinou selhání..
 
Odpovědět
3.8.2022 19:43
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 99.