Drobnosti z C# 12

C# 12 tu už máme od Novembra 2023. O jednotlivých novinkách som napísal samostatné články:

Ostalo zopár drobností, ktoré sa nedostali do samostatných článkov.

Experimental attribute

V C# 12 pribudol nový atribút Experimental. Tento atribút môžeme použiť na označenie tried, metód, vlastností, ktoré sú v experimentálnom štádiu.
Umožňuje nám označiť, že daná časť kódu je v experimentálnom štádiu a môže sa zmeniť, alebo úplne zmiznúť.

[Experimental(diagnosticId: "KROS_EXPERIMENTAL_001")]
public class ExperimentalClass
{
    [Experimental(diagnosticId: "KROS_EXPERIMENTAL_002")]
    public void ExperimentalMethod()
    {
    }

    [Experimental(diagnosticId: "KROS_EXPERIMENTAL_003")]
    public int ExperimentalProperty { get; set; }
}

Diagnostic message:

'{0}' is for evaluation purposes only and is subject to change or removal in future updates.

ref readonly parameters

V C# 12 pribudla možnosť použiť ref readonly parametre. Týmto spôsobom môžeme zabezpečiť, že metóda nebude meniť hodnotu parametra.

static void Print(ref readonly int value)
{
    // value = 10; // 👈 compilation error
    Console.WriteLine(value);
}

Dôvody priamo z dokumentácie:

  • APIs created before in was introduced might use ref even though the argument isn't modified. Those APIs can be updated with ref readonly. It won't be a breaking change for callers, as would be if the ref parameter was changed to in.
  • APIs that take an in parameter, but logically require a variable. A value expression doesn't work.
  • APIs that use ref because they require a variable, but don't mutate that variable.

Default Lambda Parameters

Doteraz nebolo možné použiť default hodnoty pre parametre v lambde. Od C# 12 to už možné.

var getProductPrice = (decimal price, string currency = "€", string format = "f4")
    => string.Format("Price is {0} {1}", price.ToString(format), currency);

string price1 = getProductPrice(1000M);
string price2 = getProductPrice(1000M, "CZK");
string price3 = getProductPrice(1000M, "CZK", "f2");