Tag Archives: VS2015

C# 6.0: Expression-bodied function members [2/10]

Expression-syntaxi s „lambda-šipkou“, kterou známe již z běžného kódu u lambda výrazů, je nyní možné ji použít i pro zápis těla metody, getteru nebo obdobné situace (např. operátoru).

Použití pro metody, operátory a typové konverze

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
public static Complex operator +(Complex a, Complex b) => a.Add(b);
public static implicit operator string(Person p) => p.First + " " + p.Last;

Výsledek je stejný, jako by metoda měla klasické tělo s blokem a v něm samotný return příkaz.

Syntaxi lze použít, o pokud metoda „vrací“ void, nebo u asynchronních metod vracejících Task, stejně jako u lambda-výrazů:

public void Print() => Console.WriteLine(First + " " + Last);

Použití pro getter property a indexer

Syntaxi lze použít i pro zkrácený zápis getteru property (property pak nemůže mít setter), nebo pro indexer:

public string Name => First + " " + Last;
public Customer this[long id] => store.LookupCustomer(id);

Série článků o novinkách v C# 6.0:

  1. Auto-property initializers a getter-only (read-only) auto-properties
  2. Expression-bodied function members
  3. Using static
  4. Null-conditional operators (?., ?[], …)
  5. String inerpolation – zkrácený String.Format()
  6. nameof() expressions
  7. Index initializers – přehlednější inicializace slovníků
  8. Exception filters, await v catch/finally blocích
  9. Konstruktor struct bez parametrů
  10. Ostatní (extension-Add v initializers, overload resolution)

C# 6.0: Auto-property initializers a getter-only (read-only) auto-properties [1/10]

Preview Visual Studio 2015 a .NET 4.6 dnes vyšly, nastal tedy čas si v seriálu krátkých článků připomenout novinky v C# 6.0 (jednotlivé články zamýšlené série budou přibývat postupně):

RTM Update: Constructor struct bez parametrů byl z finální podoby C# 6.0 odstraněn.

  1. Auto-property initializers a getter-only (read-only) auto-properties
  2. Expression-bodied function members
  3. Using static
  4. Null-conditional operators (?., ?[], …)
  5. String inerpolation – zkrácený String.Format()
  6. nameof() expressions
  7. Index initializers – přehlednější inicializace slovníků
  8. Exception filters, await v catch/finally blocích
  9. Konstruktor struct bez parametrů – není součástí C# 6.0 RTM
  10. Ostatní (extension-Add v initializers, overload resolution)
  11. Primary constructors
  12. Declaration expression

Finální podoba C# 6.0 se může měnit, články vychází z informací z okamžiku vydání VS 2015 Preview – soupisu změn od Madse Torgersena, C# Language PM a ze stručného seznamu změn vedeného u projektu Roslyn.

V tuto chvíli k velkému smutku všech zúčastněných byly ze C# 6.0 odstraněny dvě oblíbené konstrukce, které již v CTP verzích fungovaly:

  1. Primary constructors  – public class Point(int x, int y)
  2. Declaration expressions – if (int.TryParse(input, out int output))

Dá se předpokládat, že cut-off v tomto případě znamená odklad do C# 7.0, i když může dojít i k zásadním změnám.

Initializers for auto-properties

Jde o syntaxi známou z běžných fieldů, jejíž použitelnost byla rozšířena na auto-properties:

public class Customer
{
    public string First { get; set; } = "Jane";
    public string Last { get; set; } = "Doe";
}

Ve skutečnosti dojde k inicializaci podkladového fieldu, na který se auto-property mapuje.

Getter-only auto-properties (readonly)

V předchozích verzích C# musela mít auto-property setter i getter. Nově lze definovat pouze getter a ve skutečnosti tím vznikne read-only podkladový field, který lze nastavit buď pomocí initializeru (viz výše) nebo z constructoru.

public class Customer
{
    public string First { get; } = "Jane";
    public string Last { get; } = "Doe";
}

Nabízí se zde použití pro immutable třídy, v nichž dosud zkrácenou syntaxi auto-properties nebylo možné využít.