Než začnete s implementací kódu, je důležité porozumět konceptům programování C #. Než přejdeme na rozdíly mezi const a readonly, nejprve pochopíme klíčová slova a jak se používají v programu. Obě jsou nejčastější klíčová slova používaná v programování C # a v zásadě pro stejný účel. Obě klíčová slova se však od sebe velmi liší. Const je vyhrazené slovo, které se používá k reprezentaci konstantních hodnot a určuje, že hodnotu nelze po kompilaci změnit, zatímco readonly je modifikátor, který lze použít na polích a jehož hodnotu lze během běhu změnit. Pojďme se podívat na některé z klíčových rozdílů mezi const a readonly.
Konstanta označuje konstantní proměnnou, jejíž hodnotu je třeba při deklaraci přiřadit pouze jednou. Pokud je během deklarace použito konstantní klíčové slovo, stává se konstantou, což znamená, že hodnota zůstává konstantní a nelze ji v průběhu programu měnit. Je to spíše vyhrazené slovo, které určuje, že hodnota nesmí být po kompilaci upravována. Konstanta je ve výchozím nastavení implicitně statická, takže ji lze volat pomocí názvu třídy pomocí „Classname.VariableName“. Konstantní hodnoty se také nazývají literály. Může to být jakýkoli základní datový typ, jako je celočíselná konstanta, plovoucí konstanta nebo řetězcový literál.
Klíčové slovo Readonly je modifikátor, který lze použít pouze na polích, ale nikoli na lokálních proměnných. Čtené pole může být inicializováno buď v době deklarace, nebo uvnitř konstruktoru ve stejné třídě, takže hodnoty se mohou lišit pro různá provedení programu v závislosti na použitém konstruktoru. Klíčové slovo pro čtení určuje, že proměnná instance objektu není upravitelná a jakýkoli pokus o jeho změnu po deklaraci vede k chybě kompilace. Proměnná se změní až po provedení. Proměnné jsou vytvářeny pouze pro zastavení volání kódu z jeho náhodného pozměnění po jeho sestavení.
Konstantní (const) klíčové slovo není nic jiného než neměnné proměnné, jejichž hodnota může být inicializována pouze v době kompilace. Tyto konstantní hodnoty se také nazývají literály. To nám jednoduše umožňuje určit, zda je proměnná modifikovatelná nebo ne. Zjednodušeně řečeno, konstanty jsou implicitně statické a měly by být inicializovány dříve, než budou použity v programu. Na druhé straně klíčové slovo pro čtení je modifikátor, který lze použít na polích a jehož hodnotu lze během běhu změnit. Zabraňuje změnám polí a jejich hodnoty lze nastavit pomocí referenčních proměnných.
Konstanta je ve výchozím nastavení statická a hodnoty, které by měly být přiřazeny v době deklarace proměnné, což znamená, že hodnoty jsou přiřazeny pouze v době kompilace. Konstanta je deklarována pomocí klíčového slova „const“. Inicializace konstantního pole musí být konstantní výraz a nesmí být upravována. Jednoduše řečeno, const je konstanta kompilačního času. Na druhé straně pole typu readonly lze inicializovat pouze na úrovni třídy, která není uvnitř metody, a pole nelze po inicializaci změnit. Jinými slovy, proměnné typu readonly mohou být inicializovány v době deklarace nebo uvnitř konstruktoru.
Hodnota const je vložena přímo do kódu, protože funguje jako náhrada kompilačního času. Kompilátor umístí konstantní hodnotu do metadat sestavy, která definuje konstantu a vloží hodnotu do samotného kódu IL po inicializaci, takže pro konstanty za běhu není pro přidělení potřeba žádná paměť. Hodnota pro čtení není konstantní a je uložena v haldě zavaděče, pro kterou nelze přidělit paměť, dokud není načten její typ. Pole pro čtení jsou uložena v dynamické paměti, takže hodnoty lze získat pouze za běhu.
Přestože jsou obě klíčová slova používána téměř ke stejnému účelu, mají odlišnou sémantiku binárních verzí. Když výraz odkazuje na konstantu, kompilátor vloží hodnotu v době kompilace. Pokud je tedy hodnota použita v jiné sestavě, je třeba aktualizovat původní sestavu a hodnotu změnit. Změny v sestavě se neprojeví, dokud nebude překompilován. Hodnota se nezíská až za běhu, když výraz odkazuje na pole jen pro čtení. Pokud je hodnota změněna v jiné sestavě, změny se projeví v sestavě, jakmile je načtena, aniž by bylo nutné ji překompilovat.
Obě klíčová slova se používají pro stejnou věc, jako je deklarace člena, takže hodnoty nelze v průběhu programu měnit. Klíčové slovo const se však velmi liší od klíčového slova readonly. Konstanta je konstantní proměnná, jejíž hodnota by měla být inicializována v době kompilace, zatímco pole readonly může být inicializováno pouze na úrovni třídy, buď v době deklarace, nebo uvnitř konstruktoru. Const je kompilační časová konstanta, zatímco pole jen pro čtení jsou pouze pro čtení. K proměnným Constance lze přistupovat pomocí „Classname.VariableName“, zatímco proměnné typu readonly lze získat pomocí „InstanceName.VariableName“. Konstantní proměnné mohou být navíc deklarovány v metodách, zatímco pole readonly nelze v metodách deklarovat.