Co nowego w C# 7, 7.x i... 8!

O mnie...

Marcin Zajkowski

Trener i Certyfikowany Master Umbraco
@ The Cogworks

Czarodziej od Treści i Wiedzy, Wódz Trenerów (CKO, CIO) / PedagoGEEK @ WOW School

Ja, 'bloger' @ udfnd.pl

Kuba Wojewódzki @ umbra.coffee

@zajkowskimarcin

@zajkowskimarcin

Zacznijmy od kilku pytań...

Pytanie 1/64

Kto korzysta na co dzień z Visual Studio 2017?

Pytanie 2/64

Kto wykorzystuje już funkcje i składnię C# 7?

Dają to bierz!

Jeśli nie możesz korzystać z najnowszej wersji w pracy, rób to po niej. Wyjdzie Ci to na dobre :)

public class GoldenThough1 : ITweetable {
}

Historia C# w pigułce

  • C# 3 - LINQ FTW!
  • C# 4 - Dynamics FTW!
  • C# 5 - Async FTW!
  • C# 6 - ???
  • C# 7 - ???
  • C# 8 - ???

C# FTW!

C# 7.1

14 Sierpień 2017
Visual Studio 2017 Update 3 (v15.3)

https://github.com/dotnet/csharplang

Nie narzekaj - kontrybuuj!

Rozwijać się powinny nie tylko języki (programowania), ale także narzędzia do pracy z nimi.

public class GoldenThough2 : ITweetable {
}

...no i VS się zmienia!

(nie tylko upodabniając i małpując ReSharpera ;))

C# 7.x z Umbraco?

(lub dowolną inną, już funkcjonującą aplikacją .NET)

"Yes, we can!"

Update / Reinstall pakietów NuGet

  • Microsoft.CodeAnalysis.Analyzers
  • Microsoft.CodeAnalysis.Common
  • Microsoft.CodeAnalysis.CSharp
  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform
install-package System.ValueTuple

(tylko dla .NET Framework < 4.7)

Demo?

C# 8!

Default Interface Members

public interface ICanHasDefaultMembers
{
    void FireDev();

    void FireAllDevs()
    {
        foreach (var dev in theCogworks)
        {
            FireDev();
        }
    }
}

public class MySweetClassWhichIDontWantToModify : ICanHasDefaultMembers
{
    public void FireDev()
    {
        // You know what to do :>
    }
}
public interface ICanHasDefaultMembers
{
    void FireDev();

    void FireAllDevs()
    {
        foreach (var dev in theCogworks)
        {
            FireDev();
        }
    }
}

public class MySweetClassWhichIDontWantToModify : ICanHasDefaultMembers
{
    public void FireDev()
    {
        // You know what to do :>
    }

    private void FireAllDevs() 
    {
        // My private member
    }
}
MySweetClassWhichIDontWantToModify myClass = new MySweetClassWhichIDontWantToModify();
myClass.FireAllDevs(); // Doesn't work because FireAllDevs() is private

ICanHasDefaultMembers myClassOnSteroids = (ICanHasDefaultMembers)myClass;
myClassOnSteroids.FireAllDevs(); // It works!

Nullable
(non-nullable / null) Reference Types

int i = 0; // I can't be null
int? i = null; // I can be null!
string s;
string? t;

t = null;
int i = t.Length; // Warning

if(t != null) {
    int j = t.Length; // No warning - smart compiler!
}

if(!t.IsNullOrWhiteSpace()) {
    int l = t.Length; // Warning!
    int m = t!.Length; // I'm smarter than compiler, and DAMNIT, I don't have null here for sure! :>
}
string s; // Should never be null
string? s1; // Can be null

s?.Length; // Check this one for null, please!
s!.Length; // Don't check this, I'm smarter than you :)

Async Streams

async Task<bool> ThisIsWellKnownAndUsedTaskAsync(){
    return true;
}

await ThisIsWellKnownAndUsedTaskAsync();

// ---------------------------------------------------

IAsyncEnumerable<T> willItBlowOrNotHmmmWeWillSee = ...

foreach await(var bang in willItBlowOrNotHmmmWeWillSee)
{
    // Thread is not blocked and item is retrieved
    // Move next when data is here!
}

Pull model zgoła odmienny od

modelu push w IObservable np.

Async Dispose

Extension Everything

public class SomeClassWhichNeedsToBeExtended
{

}

public static class SomeClassWhichNeedsToBeExtendedExtensions
{
    public static T MethodName<T>(this SomeClassWhichNeedsToBeExtended instance)
    {
        return default(T);
    }
}

What we're doing now...

extension MyClassExtension extends ClassToBeExtended
{
    public int AddAnotherHead()
    {
        this.Heads++; // it call the current instance of MyClassExtension
    }

    public int Heads()
    {
        get { ... }
    }
}

// --------------------------------------------------------------------

extension SomeComplexExtension extends MyClass : IMyInterface
{
    ...
}

C# 9!?

Gdzie szukać więcej informacji

Więc.. chcesz wygrać (dev)randkę lub licencję JetBrains? :)

Wymień (na Twitterze z #dotnetconfpl) nazwy trzech (3) metod lub zmiennych wykorzystanych w moich dzisiejszych demach!

Tweetuj
ITweetable ;)

...i korzystaj z najnowszej
wersji C#!

public class GoldenThough3 : ITweetable {
}

Dziękuję za uwagę! Pytania? Slack!

@zajkowskimarcin  /  marcin.zajkowski@thecogworks.com