Upload
damir-arh
View
385
Download
0
Embed Size (px)
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
Virihttp://bit.ly/vs15previewhttps://github.com/dotnet/roslynhttp://bit.ly/CsDesignNoteshttp://bit.ly/BuildRoslynhttp://bit.ly/DncRoslynOverview
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.