How Might C# 7 Look Like?

Preview:

Citation preview

Kakšen bo morda C# 7.0?Damir Arh, Razum d.o.o.Microsoft MVP@DamirArhhttp://www.damirscorner.com

AgendaVisual Studio 2015 in RoslynPrevajalnik kot odprtokodni projektNovosti v C# 7.0

Prevajalnik kot storitev

Formatter

Colorizer

Outlining

Navigate To

Object Browser

Completion List

Find

All References

Rename

Quick Info

Signature Help

Extract

Method

Go To Definition

Edit

and

Continue

Syntax Tree API Symbol API Binding and

Analysis API Emit API

ParserSymbols

Binder IL EmitterMetadata

Import

Izvorna koda

Izvršljiva

datoteka

Language

Service

Compiler API

Compiler

Pipeline

Prevajalnik

Uporaba v Visual Studiu 2015

Hitrejši nadaljnji razvojVisual Studio 2015 Update 1(november 2015)

Interaktivno oknoIskanje implementacijIzboljšave statične analize kode

Visual Studio Update 2(marec 2016)

Interaktivno okno za projektMehko iskanje razredovDeterministično prevajanje kodeVisual Studio „15“ Preview

(marec 2016)

Uveljavljanje definiranega sloga izvorne kodeSpreminjanje datotek XAML med izvajanjem aplikacijeEksperimentalne razširitve C#

Uporaba v drugih projektih

Kratka zgodovina C#

Generiki(2005)

LINQ(2007)

dynamic(2010)

async(2012)

Roslyn(2015)

Ključne teme C# 7.0Delo s podatkiZanesljivostUčinkovitost

Ujemanje vzorcevObjektno usmerjeni jezikiVnaprej znane operacijeEnostavno dodajanje podatkovnih tipovPolimorfizem

Funkcionalni jezikiVnaprej znani podatkovni tipiEnostavno dodajanje operacijUjemanje vzorcev

Ujemanje vzorcev

Visual Studio „15“ Preview

Kaj smo videli?Operator „is“ z deklaracijo spremenljivkeStavek „switch“ z ločevanjem po tipuDodatni pogoj v stavku „case“

Stavek „switch“ v izrazustatic State Request(this State state, Transition transition) => (state, transition) match ( case (State.Running, Transition.Suspend): State.Suspended case (State.Suspended, Transition.Resume): State.Running case (State.Suspended, Transition.Terminate): State.NotRunning case (State.NotRunning, Transition.Activate): State.Running case *: throw new InvalidOperationException() );

 

Terkepublic (int weight, int count) Stocktake(IEnumerable<IWeapon> weapons){ var w = 0; var c = 0; foreach (var weapon in weapons) { w += weapon.Weight; c++; } return (w, c);}

public class Sword(int Damage, int Durability);public class Sword : IEquatable<Sword>{ public int Damage { get; } public int Durability { get; }

public Sword(int Damage, int Durability); public bool Equals(Sword other); public override bool Equals(object other); public override int GetHashCode(); public static void operator is(Sword self, out int Damage, out int Durability); public Sword With(int Damage = this.Damage, int Durability = this.Durability);}

Zapisi

Nespremenljivi razrediPoenostavljena sintaksa

IWeapon sword = new Sword { Damage = 5, Durability = 500 };

IWeapon strongerSword = sword with { Damage = 8 };

public Sword With(int Damage = this.Damage, int Durability = this.Durability) => new Sword(Damage, Durability);

IWeapon strongerSword = sword.With(Damage: 8);

Varna uporaba neobveznih vrednostiSpremenljivka dovoli ničelne vrednosti?IWeapon? canBeNull;IWeapon cantBeNull;

Statično preverjanje pri prirejanjucanBeNull = null; // no warningcantBeNull = null; // warningcantBeNull = canBeNull; // warning

Nezdružljivost z obstoječo kodo

Lokalne funkcijestatic void ReduceMagicalEffects(this IWeapon weapon, int timePassed){ double decayRate = CalculateDecayRate(); double GetRemainingEffect(double currentEffect) => currentEffect * Math.Pow(decayRate, timePassed);

weapon.FireEffect = GetRemainingEffect(weapon.FireEffect); weapon.IceEffect = GetRemainingEffect(weapon.IceEffect); weapon.LightningEffect = GetRemainingEffect(weapon.LightningEffect);}

Rezultati funkcij in spremenljivke po referenci[Test]public void LocalVariableByReference(){ var terrain = Terrain.Get();

ref TerrainType terrainType = ref terrain.GetAt(4, 2); Assert.AreEqual(TerrainType.Grass, terrainType);

// modify enum value at the original location terrain.BurnAt(4, 2); // local value was also affected Assert.AreEqual(TerrainType.Dirt, terrainType);}

public ref TerrainType GetAt(int x, int y) => ref terrain[x, y];

Rezinevar array = new int[] { 1, 2, 3, 4, 5 };var slice = Array.Slice(array, 0, 3);

1 2 3 4 51 2 3array

slice

Visual Studio „15“ PreviewUjemanje vzorcevLokalne funkcijeRezultati funkcij in spremenljivke po referenciBinarne konstantne vrednostiLočila med števkami

Naslednji korakiPraktični preizkusSpremljanje zapiskov na GitHubuSodelovanje v diskusijahPrevod in preizkus izvorne kode…

DNC Magazine

Izpolnite anketo! Vam je bilo predavanje všeč? Ste se naučili kaj novega?

Vaše mnenje nam veliko pomeni!

Da bo NT konferenca prihodnje leto še boljša, vas prosimo, da izpolnite anketo o zadovoljstvu, ki jo najdete v svojem NTK spletnem profilu.

© 2015 Microsoft Corporation. All rights reserved.

Recommended