Drobnosti z C# 12
Drobnosti z C# 12 čo sa nedostali do samostatných článkov.
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 withref 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");