Zoeken…


Opmerkingen

C # versie 3.0 is uitgebracht als onderdeel van .Net versie 3.5. Veel van de functies die met deze versie zijn toegevoegd, ondersteunen LINQ (Language INtegrated Queries).

Lijst met toegevoegde functies:

  • LINQ
  • Lambda-uitdrukkingen
  • Uitbreidingsmethoden
  • Anonieme typen
  • Impliciet getypte variabelen
  • Initializers voor objecten en collecties
  • Automatisch geïmplementeerde eigenschappen
  • Expressie bomen

Impliciet getypte variabelen (var)

Met het sleutelwoord var kan een programmeur impliciet een variabele typen tijdens het compileren. var verklaringen zijn van hetzelfde type als expliciet gedeclareerde variabelen.

var squaredNumber = 10 * 10;
var squaredNumberDouble = 10.0 * 10.0;
var builder = new StringBuilder();
var anonymousObject = new
{ 
    One = SquaredNumber,
    Two = SquaredNumberDouble,
    Three = Builder
}

De typen van de bovenstaande variabelen zijn respectievelijk int , double , StringBuilder en anonymous.

Het is belangrijk op te merken dat een var variabele niet dynamisch wordt getypt. SquaredNumber = Builder is niet geldig omdat u probeert een int te stellen op een instantie van StringBuilder

Language Integrated Queries (LINQ)

//Example 1
int[] array = { 1, 5, 2, 10, 7 };

// Select squares of all odd numbers in the array sorted in descending order
IEnumerable<int> query = from x in array
                         where x % 2 == 1
                         orderby x descending
                         select x * x;
// Result: 49, 25, 1

Voorbeeld uit een wikipedia-artikel over C # 3.0, LINQ subsectie

Voorbeeld 1 gebruikt querysyntaxis die is ontworpen om te lijken op SQL-query's.

//Example 2
IEnumerable<int> query = array.Where(x => x % 2 == 1)
    .OrderByDescending(x => x)
    .Select(x => x * x);
// Result: 49, 25, 1 using 'array' as defined in previous example

Voorbeeld uit een wikipedia-artikel over C # 3.0, LINQ subsectie

Voorbeeld 2 gebruikt de syntaxis van de methode om hetzelfde resultaat te bereiken als in voorbeeld 1.

Het is belangrijk op te merken dat in C # de syntaxis van de LINQ-query syntactische suiker is voor de syntaxis van de LINQ-methode. De compiler vertaalt de query's tijdens het compileren naar methodeaanroepen. Sommige vragen moeten worden uitgedrukt in syntaxis van de methode. Van MSDN - "U moet bijvoorbeeld een methode-aanroep gebruiken om een query uit te drukken die het aantal elementen ophaalt dat overeenkomt met een opgegeven voorwaarde."

Lambda-uitdrukkingen

Lambda-expressies zijn een uitbreiding van anonieme methoden die impliciet getypeerde parameters en retourwaarden mogelijk maken. Hun syntaxis is minder uitgebreid dan anonieme methoden en volgt een functionele programmeerstijl.

using System;
using System.Collections.Generic;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        var numberList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        var sumOfSquares = numberList.Select( number => number * number )
            .Aggregate( (int first, int second) => { return first + second; } );
        Console.WriteLine( sumOfSquares );
    }
}

De bovenstaande code zal de som van de vierkanten van de nummers 1 tot en met 10 naar de console uitvoeren.

De eerste lambda-uitdrukking regelt de getallen in de lijst. Omdat er slechts 1 parameter tussen haakjes kan worden weggelaten. U kunt haakjes opnemen als u dat wilt:

.Select( (number) => number * number);

of typ de parameter expliciet, maar haakjes zijn vereist:

.Select( (int number) => number * number);

Het lambda-lichaam is een uitdrukking en heeft een impliciete terugkeer. Je kunt ook een statement body gebruiken als je dat wilt. Dit is handig voor complexere lambdas.

.Select( number => { return number * number; } );

De selectiemethode retourneert een nieuwe IEnumerable met de berekende waarden.

De tweede lambda-uitdrukking somt de getallen in de lijst op die zijn geretourneerd door de selectiemethode. Haakjes zijn vereist omdat er meerdere parameters zijn. De typen parameters worden expliciet getypt, maar dit is niet nodig. De onderstaande methode is equivalent.

.Aggregate( (first, second) => { return first + second; } );

Zoals deze:

.Aggregate( (int first, int second) => first + second );

Anonieme typen

Anonieme typen bieden een handige manier om een set alleen-lezen eigenschappen in een enkel object in te kapselen zonder eerst een type expliciet te definiëren. De typenaam wordt gegenereerd door de compiler en is niet beschikbaar op broncodeniveau. Het type van elke eigenschap wordt afgeleid door de compiler.

U kunt anonieme typen maken door het new trefwoord te gebruiken, gevolgd door een accolade ( { ) . Binnen de accolades kunt u eigenschappen definiëren zoals op onderstaande code.

var v = new { Amount = 108, Message = "Hello" };

Het is ook mogelijk om een reeks anonieme typen te maken. Zie onderstaande code:

var a = new[] { 
    new { 
        Fruit = "Apple", 
        Color = "Red" 
    },
    new {
        Fruit = "Banana",
        Color = "Yellow"
    }
};

Of gebruik het met LINQ-zoekopdrachten:

var productQuery = from prod in products
                   select new { prod.Color, prod.Price };


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow