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
Ondřej Štorc
Tvůrce
Avatar
Odpovedá 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;
Odpovedať
Ž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.

Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovedá 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.

Odpovedať
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
David
Člen
Avatar
David:16.4.2020 10:09

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

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?

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

Editované
Odpovedať
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}.");
}
Odpovedať
S úsměvem jde všechno lépe :-)
Avatar
Jiří Pivec
Člen
Avatar
Odpovedá 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;
    }
}
Odpovedať
„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

Editované
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í..
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.