Vlastnosti v C# sú kľúčovým konceptom, ktorý kombinuje aspekty polí a metód. Poskytujú riadený prístup k interným dátam triedy a umožňujú pridať logiku pri čítaní alebo zápise hodnôt. Tento článok sa podrobne zaoberá definíciou a využitím konštrukcie public string get; set; v jazyku C#.
Čo sú vlastnosti v C#?
Pre používateľa objektu sa vlastnosť javí ako pole; prístup k vlastnosti vyžaduje rovnakú syntax. Pre implementátora triedy je vlastnosť jeden alebo dva bloky kódu, ktoré predstavujú prístupovú metódu get a/alebo set, prípadne init prístupovú metódu.
Blok kódu pre prístup get sa spustí, keď sa vlastnosť číta; blok kódu pre prístup set alebo init sa spustí, keď je vlastnosti priradená hodnota. Vlastnosť bez prístupového objektu set sa považuje za len na čítanie. Vlastnosť bez prístupového prvku get sa považuje za iba na zápis. Vlastnosť, ktorá má obe prístupové metódy, je na čítanie a zápis.
Na rozdiel od polí nie sú vlastnosti klasifikované ako premenné. Vlastnosti sú deklarované v bloku triedy zadaním úrovne prístupu vlastnosti, nasledovanej typom vlastnosti, názvom vlastnosti a následným blokom kódu, ktorý deklaruje get-accessor a/alebo set-accessor.
Automaticky implementované vlastnosti poskytujú zjednodušenú syntax pre jednoduché deklarácie vlastností. Kompilátor automaticky vytvorí privátnu členskú premennú (backing field), ku ktorej sa pristupuje cez get a set prístupové členy.

Prístupový objekt get
Telo get-accessor sa podobá telu metódy. Musí vrátiť hodnotu typu vlastnosti. Kompilátor jazyka C# a kompilátor JIT (Just-in-Time) detekujú bežné vzory pre implementáciu get-accessor a optimalizujú tieto vzory. Napríklad get-accessor, ktorý vracia pole bez vykonania výpočtu, je pravdepodobne optimalizovaný na čítanie pamäte daného poľa. Automaticky implementované vlastnosti sa riadia týmto vzorom a využívajú tieto optimalizácie.
Pri odkazovaní na vlastnosť, s výnimkou, keď je cieľom priradenia, je vyvolaný get-accessor na čítanie hodnoty vlastnosti. Tento get-accessor možno použiť na vrátenie hodnoty poľa alebo na jej výpočet a následné vrátenie.
Vo všeobecnosti je zlý programovací štýl meniť stav objektu pomocou get-accessor.
Prístupový objekt set a init
Prístupový set-objekt sa podobá metóde, ktorej návratový typ je void. Používa implicitný parameter s názvom value, ktorého typ je typ vlastnosti. Kompilátor a kompilátor JIT tiež rozpoznávajú bežné vzory pre určitý set-objekt alebo init-príslušenstvo. Tieto bežné vzory sú optimalizované, priamo zapisujú pamäť pre podporné pole. Keď priradíte hodnotu k vlastnosti, je pomocou argumentu, ktorý poskytuje novú hodnotu, vyvolaný prístupový objekt set.
Kód pre vytvorenie prístupového objektu init je rovnaký ako kód pre vytvorenie prístupového objektu set, iba použijete kľúčové slovo init namiesto set.
Differences between a field and a property in C#
Príklad definície a využitia public string get; set;
Definícia public string prispevok { get; set; } predstavuje automatickú vlastnosť typu string. Pozostáva z:
- public: Modifikátor prístupu, ktorý určuje, že vlastnosť je prístupná odkiaľkoľvek.
- string: Dátový typ vlastnosti, v tomto prípade reťazec znakov.
- prispevok: Názov vlastnosti.
- get;: Prístupový člen, ktorý umožňuje čítanie hodnoty vlastnosti.
- set;: Prístupový člen, ktorý umožňuje zápis hodnoty do vlastnosti.
V kontexte webovej aplikácie alebo formulára môže byť vlastnosť prispevok použitá na uloženie a manipuláciu s textom príspevku používateľa. Nižšie uvedený príklad ilustruje použitie automatickej vlastnosti Text v triede Prispevok a jej priradenie z textového poľa formulára.
public class Prispevok{ public string Autor { get; set; } public string Text { get; set; } public DateTime Datum { get; set; }}public partial class AddCommentForm : Form{ private Prispevok novyPrispevok; public AddCommentForm() { InitializeComponent(); novyPrispevok = new Prispevok(); } private void SaveButton_Click(object sender, EventArgs e) { novyPrispevok.Autor = AutorTextBox.Text; novyPrispevok.Text = CommentTextBox.Text; novyPrispevok.Datum = DateTime.Now; // Uloženie príspevku do databázy alebo iného úložiska UlozPrispevok(novyPrispevok); MessageBox.Show("Príspevok bol úspešne uložený."); this.Close(); }}V tomto príklade je vlastnosť Text triedy Prispevok použitá na uloženie textu komentára zadaného používateľom do textového poľa CommentTextBox. Pri kliknutí na tlačidlo "Save" sa hodnota z CommentTextBox.Text priradí do novyPrispevok.Text.

Modifikátory prístupu a ďalšie vlastnosti
Vlastnosti môžu byť označené ako public, private, protected, internal, protected internal, alebo private protected. Tieto modifikátory prístupu definujú, ako používatelia triedy majú prístup k vlastnosti. Pre prístupové objekty get a set pre rovnakú vlastnosť môžu byť použité rôzne modifikátory prístupu. Napríklad get môže byť nastavený tak, aby umožňoval prístup len na čítanie z vonkajšej strany typu, a public môže byť set alebo private.
Statické vlastnosti
Vlastnosť možno deklarovať ako statickú vlastnosť pomocou kľúčového slova static. Statické vlastnosti sú kedykoľvek k dispozícii volajúcim, aj keď žiadna inštancia triedy neexistuje.
Virtuálne a abstraktné vlastnosti
Vlastnosť možno označiť ako virtuálnu vlastnosť pomocou kľúčového slova virtual. Virtuálne vlastnosti umožňujú odvodeným triedam predefinovať správanie vlastnosti pomocou kľúčového slova override. Vlastnosť predefinujúca virtuálnu vlastnosť môže byť tiež zapečatená, čo špecifikuje, že pre odvodené triedy už nie je virtuálna. Nakoniec, možno deklarovať abstraktnú vlastnosť. Abstraktné vlastnosti nedefinujú implementáciu v triede a odvodené triedy musia zapísať vlastnú implementáciu. Napríklad, ak dve triedy Cube a Square implementujú abstraktnú triedu Shape a predefinujú jej abstraktnú vlastnosť Area, je dôležité si všimnúť použitie modifikátora override u vlastností.

Riešenie bežných problémov vo formulároch C#
Pri práci s formulármi v C# sa často stretávame s rôznymi problémami, najmä pri implementácii funkcionalít, ako je spracovanie príspevkov alebo interakcia s dátami. Diskusia na fóre poukazuje na niektoré z nich:
- Nesprávne používanie metód Show() a Hide(): Na zobrazenie alebo skrytie formulára je potrebné použiť metódy Show() a Hide() na inštancii formulára. Dôležité je vytvoriť inštanciu formulára predtým, ako sa na ňu odkážeme.
- Životný cyklus formulára: Pri zatvorení formulára sa štandardne uvoľnia všetky jeho zdroje. Ak chceme zachovať stav formulára, môžeme použiť metódu Hide() namiesto Close().
- Uchovávanie stavu formulára: Pri prechode medzi formulármi je potrebné zabezpečiť, aby sa zachoval stav formulára, napríklad obsah textových polí.
- Cenzurovanie textu: Funkcia na cenzurovanie nevhodných slov v texte.
- Práca s databázou MySQL: Triedy na jednoduchšiu prácu s MySQL databázou.
- Práca so SESSION: Trieda na spravovanie SESSION premenných.
- Zmena parametrov URL adresy: Funkcia na zmenu, pridanie alebo vymazanie parametrov v URL adrese.
- Zistenie počtu pracovných dní medzi dátumami: Funkcia na výpočet počtu pracovných dní medzi dvoma dátumami.
- Nákupný košík: Skript ilustrujúci pridávanie a odstraňovanie produktov z nákupného košíka.
- Stránkovanie: Funkcia na rozdelenie väčšieho množstva dát na menšie stránky.
- Správa "pekných URL adries": Funkcia na vytváranie a spravovanie "pekných" URL adries.
- Generovanie zmenšeniny obrázka: Funkcia na vytvorenie zmenšeniny obrázka.
- Vkladanie reťazca do iného reťazca: Funkcia na vloženie reťazca na definovanú pozíciu v inom reťazci.
- Parsovanie template súborov: Trieda na parsovanie template súborov a generovanie HTML.
- Zistenie pozície podreťazca v reťazci: Funkcia na zistenie pozície n-tého výskytu podreťazca v reťazci.
- Zistenie veľkosti priečinka: Funkcia na zistenie celkovej veľkosti priečinka.
- Získavanie údajov o počasí z Google API: Trieda na získavanie údajov o počasí z Google API.
- Generovanie kalendára: Skript na generovanie kalendára.
- Export dát z MySQL do XML: Trieda na export dát z MySQL do XML.
Optimalizácia kódu a výkon
Pri vývoji aplikácií v C# je kľúčové venovať pozornosť optimalizácii kódu pre dosiahnutie lepšieho výkonu. Diskusie na fóre často riešia otázky súvisiace s rýchlosťou a efektivitou. Tu sú niektoré body, ktoré vyplynuli z diskusie:
- Efektivita zápisu: Závisí od dvoch hlavných veličín: počtu prvkov poľa a počtu operácií, ktoré je potrebné dokončiť.
- Predčasné ukončenie operácií: Akonáhle sa zistí, že sa v posloupnosti opakuje číslo, je možné túto operáciu predčasne ukončiť a ušetriť tak drahocenný čas.
- Časové meranie: Použitie triedy Stopwatch pre presnejšie meranie časových úsekov oproti DateTime. Spustenie programu aspoň 5x nad každou verziou pomáha eliminovať nepresnosti.
- Inicializácia polí: V C# sú defaultné hodnoty pre numerické typy 0, čo môže ovplyvniť testovanie, ak sa pole explicitne neinicializuje.
- Optimalizácia v cykloch: Presunutie deklarácie premennej mimo cyklus, ak je to možné, môže skrátiť čas. Napríklad, rozdiel v rýchlosti pri i++ a ++i pre vstavané typy je minimálny, ale celková architektúra cyklu (for, foreach, while, do-while) môže mať vplyv.
- Algoritmy: Použitie efektívnych algoritmov (napr. na triedenie alebo vyhľadávanie) je kľúčové. Namiesto neefektívneho porovnávania každého prvku so všetkými ostatnými, sa dajú použiť optimalizované metódy.
Diskusie často zahŕňajú porovnania rôznych implementácií a ich výkonu. Je dôležité zvážiť vplyv okolitého zaťaženia pri meraní a taktiež rozsah čísel a počet "hodov" pri testovaní. Optimalizácia je neustály proces, pri ktorom je dôležité nájsť rovnováhu medzi rýchlosťou a čitateľnosťou kódu.
| Verzia programu | Popis | Čas spracovania (ms) |
|---|---|---|
| Verzia 1 | Spracovanie s Listom (možný výpis duplicitných čísel viackrát) | ~500 |
| Verzia 2 (Dupl2) | Odstraňovanie prvkov (pomalé pre veľké polia) | N/A |
| Verzia 3 | Spracovanie s Array (rýchlejšie a úspornejšie) | ~250 |
| Verzia 4 | Optimalizovaná verzia (s usporiadaním) | ~100 |
Poznámka: Časy sú orientačné a závisia od rozsahu čísel a počtu iterácií.