TOC

This article has been localized into Czech by the community.

Třídy:

Konstanty (klíčové slovo const)

Doposud jsme se hodně zabývali proměnnými, a jak název napovídá, proměnné mohou být vždy změněny. Opačným pojmem je konstanta, která je v C# zavedena klíčovým slovem const. Při deklarování konstanty musíte okamžitě přiřadit hodnotu a po tomto přiřazení již nelze hodnotu této konstanty změnit. To je skvělé, když máte hodnotu, která se nikdy nemění, a chcete se ujistit, že není vaším kódem manipulováno, ani omylem.

V samotném frameworku najdete mnoho konstant, například ve třídě Math, kde byla definována konstanta pro PI:

Console.WriteLine(Math.PI);

Ale samozřejmě zajímavé je deklarovat nějaké vlastní konstanty. Konstanta může být definována v rozsahu metody, takto:

static void Main(string[] args)
{
    const int TheAnswerToLife = 42;
    Console.WriteLine("The answer to life, the universe and everything: " +  TheAnswerToLife);
}

Nicméně, většina konstant je deklarována na úrovni třídy, aby k nim bylo možné přistupovat (ale samozřejmě ne je měnit) ze všech metod třídy a dokonce i mimo třídu, v závislosti na viditelnosti. Konstanta bude působit jako statický člen třídy, což znamená, že k ní můžete přistupovat bez instancování třídy. S tím na paměti, pojďme vyzkoušet úplný příklad, kde jsou definovány dvě konstanty - jedna privátní a jedna veřejná:

using System;

namespace Constants
{
    class Program
    {
static void Main(string[] args)
{
    Console.WriteLine("The fake answer to life: " + SomeClass.TheFakeAnswerToLife);
    Console.WriteLine("The real answer to life: " +  SomeClass.GetAnswer());
}
    }

    class SomeClass
    {
private const int TheAnswerToLife = 42;
public const int TheFakeAnswerToLife = 43;

public static int GetAnswer()
{
    return TheAnswerToLife;
}
    }
}

Všimněte si, jak definuji třídu (SomeClass) se dvěma konstantami. První je privátní, takže k ní lze přistupovat pouze z třídy samotné, ale druhá je veřejná. Takže v našem hlavním programovém kódu přistupuji k oběma konstantám různě - nejprve přímo, protože falešná odpověď je veřejně dostupná, a za druhé s pomocí metody GetAnswer().

Jaké typy mohou být použity jako konstanta?

Protože konstanty musí být deklarovány okamžitě a později nemohou být změněny, hodnota, kterou přiřadíte konstantě, musí být konstantní výraz a kompilátor musí být schopen hodnotu vyhodnotit již v době kompilace. To znamená, že čísla, boolean hodnoty a řetězce mohou být pro konstantu použity bez problémů, zatímco například objekt DateTime nemůže být použit jako konstanta.

Vzhledem k tomu, že kompilátor musí znát hodnotu okamžitě, znamená to také, že existují určitá omezení toho, co můžete dělat při nastavování hodnoty. Například toto jsou perfektní příklady toho, co MŮŽETE dělat:

const int a = 10;  
const float b = a * 2.5f;

const string s1 = "Hello, world!";  
const string s2 = s1 + " How are you?";

Na druhou stranu nemůžete použít výsledek volání metody nebo nekonstantního člena třídy, protože toto nejsou konstantní výrazy. Zde je několik příkladů toho, co NEMŮŽETE dělat:

// NOT possible:
const int a = Math.Cos(4) * 2;
// Possible:
const string s1 = "Hello, world!";
// NOT possible:
const string s2 = s1.Substring(0, 6) + " Universe";

Rozdíl spočívá v tom, co se od kompilátoru očekává, že bude znát, když dosáhne vašeho kódu, například čísla, řetězce a další konstanty, ve srovnání s tím, co musí vykonat, aby získal hodnotu.

Alternativa ke konstantě: Pole pouze pro čtení

Pokud hledáte mírně méně restriktivní verzi konstanty třídy, možná byste se měli podívat na klíčové slovo readonly. Není dostupné na úrovni metody, ale lze jej použít na úrovni třídy pro definování pole, které lze upravit pouze během deklarace nebo provádění konstruktorové metody třídy. Jakmile je objekt k dispozici pro použití, pole readonly bude mít navždy stejnou hodnotu a nemůže být uživatelem upraveno. Pojďme to vyzkoušet:

class SomeClass
{
    private readonly DateTime rightNow;
    public readonly DateTime later = DateTime.Now.AddHours(2);

    public SomeClass()
    {
this.rightNow = DateTime.Now;
    }
}

Takže máme dvě pole pouze pro čtení: První je privátní, druhé veřejné (obvykle pro to máme vlastnosti, ale zde mě prosím sneste). První je deklarováno bez hodnoty (to můžeme dělat s poli pouze pro čtení, na rozdíl od konstant), zatímco druhé je okamžitě inicializováno. Také si všimnete, že používáme třídu DateTime jako datový typ a přiřazujeme jí nekonstantní hodnotu. Jinými slovy, děláme spoustu věcí, které nemůžeme dělat s konstantami, což dělá pole pouze pro čtení pěknou alternativou ke konstantám.

Všimněte si, jak přiřazuji hodnotu poli rightNow v konstruktoru třídy SomeClass. Jak již bylo zmíněno, toto je poslední šance přiřadit hodnotu poli pouze pro čtení. Poté, ať už jste uvnitř metody definující třídy nebo vně, dostanete chybu kompilace, pokud se pokusíte přiřadit hodnotu poli pouze pro čtení.

Shrnutí

Konstantu lze definovat buď v rámci rozsahu metody, nebo na úrovni třídy. Umožňuje vám definovat hodnotu, která je známa již v době kompilace a která později nemůže být změněna. Typické typy používané pro konstanty jsou celá čísla, desetinná čísla, řetězce a booleovské hodnoty. Pokud hledáte větší flexibilitu, zkuste pole pouze pro čtení, jak je popsáno výše.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!