C Sharp: Difference between revisions

From bibbleWiki
Jump to navigation Jump to search
Line 190: Line 190:
* Trimmed only publishes used parts (not default)
* Trimmed only publishes used parts (not default)
* ReadyToRun Image, as Native and .Net Code (Difficult o understand what this is)
* ReadyToRun Image, as Native and .Net Code (Difficult o understand what this is)
<syntaxhighlight lang="C#">
<syntaxhighlight lang="xml">
   <TarghetFramework>3.0<TarghetFramework>
   <TarghetFramework>3.0<TarghetFramework>
   <PublishSingleFile>true</PublishSingleFile>
   <PublishSingleFile>true</PublishSingleFile>

Revision as of 02:37, 10 August 2020

C# 8.0 and .Net Core 3.0

Intro

Here is the history of C#

  • 2.0 included generics
  • 3.0 Added Linq with Lambda and anonymous types
  • 4.0 Added Dynamics
  • 5.0 Added Async and Await
  • 6.0 Added Null propagating operator (targer?.IsActive ?? false;
  • 7.0 Expressions, Span and Tuples

C# 8.0 brings

  • Nullable Reference Types
  • Pattern Matching
  • Indices and Ranges
  • Built-in Json Support
  • Windows Desktop Support
  • Build and Deploy Improvements
  • Other Language Improvements
  • Other .NET Core Platform Improvements

Nullable Reference Types

This allows you to specify a possibility of null. e.g.

class
{
    public string? Title {get; set;}
    public List<Comment> Title {get;} = new List<Comment>();
}

Bad code is highlighted a compile time with CS8618 Non-nullable property and via intellisence.

You and enable and restore this feature on a file basis using #nullable enable and #nullable restore

Pattern Matching

Deconstructors

Hardcoded unlike javascript

claas Test
{
    public PropA {get; set;}
    public PropB {get; set;}
    public PropC {get; set;}
    public PropD {get; set;}

    Test(string a, string b, string c, string d)
    {
      PropA = a;
      PropB = b;
      PropC = c;
      PropD = d;
    }

    void Deconstructor(
       out string a,
       out string b,
       out string c,
       out string d)
    {
       a = PropA;
       b = PropB
       c = PropC;
       d = PropD;
    } 
}

Positional Pattern

public static bool TestHasCValue5(Test inTest)
{
    return inTest is Test(_,_,"5",_);
}

Property Pattern

public class Employee
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string Region {get; set;}
    public Employee ReportsTo {get; set;}
}

public static bool IsUsBasedWithUkManager(object o)
{
    return o is Employee e && 
        e is { Region: "US", ReportsTo: {Region:" UK" }};
}

Switch Expression

Allows switching on types
var result = shape switch
{
    Rectangle r => "{r.Length}",
    Circle {Radius: 1} c => "Small Circle", // We can use LHS too!
    Circle c => "{c.Radius}",
    Triangle t => "{t.Side1}",
    _ => "Default"
}

Tuple Pattern

public statis bool MakesBlue(Color c1, Color c2)
{
    return (c1,c2) is (Color.Red, Color.Green) ||
           (c2,c1) is (Color.Red, Color.Green);
}

Indices and Ranges

Index reference as location in the sequence

var numbers = new[] {0,1,2,3,4,5};
var number = numbers[1]; // number is 1
var numberFromRHS = numbers[^2]; // number is 4

Note ^1 is the last element

C# now supports the range expressions with dots.

var numbers = Enumerable.Range(1,10).ToArray();
var copy = numbers[0..^0];
var lastThreeItems = numbers[3^..];

Built-in Json Support

Adds support similar to NewtownSoft but does lack features. Just some key reminders in the code below. Google examples

// Reading as Tokens
    var myBytes = File.ReadAllBytes("my.json");
    var jsonSpan = myBytes.AsSpan();
    var json = new Utf8JsonReader(jsonSpan);
    while(json.Read()) // goes to next token
    {
       GetData(json);
    } 

// Parse
    using var stream = File.OpenRead("my.json");
    using var document = JsonDocument.Parse(stream);
    var root = document.RootElement;

    foreach(var prop in root.EnumerateObject())
    {
        if(prop.Value.ValueKind == JsonValueKind.Object) 
        ...
    }

// Writing
    var outputOptions = new JsonWriteOptions {
       Indented = true;
    };

    var buffer = new ArrayBufferWriter<byte>();
    using var json = new Utf8JsonWriter(buffer, outputOptions);

    json.WriteStartObject();
    json.WritePropertyName("NAME");
    json.WriteStringValue"Value");
...
    json.WriteEndObject();
    json.Flush();

// Deserialize
    var serialOptions = new JsonSerializerOptions {
       PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    };

    var myTestObject = JsonSerializer.Deserialize<TestObject>(text,serialOptions);  

// Serialize
    JsonSerializer.Serialize(myTestObject, serialOptions);

Windows Desktop Support

  • Only on Windows
  • Supports WPF in Core but
  • Supports WinForms in Core

Build and Deploy Improvements

  • Builds a platform application .exe and deps copied
  • Can publish single file (not default)
  • Trimmed only publishes used parts (not default)
  • ReadyToRun Image, as Native and .Net Code (Difficult o understand what this is)
  <TarghetFramework>3.0<TarghetFramework>
  <PublishSingleFile>true</PublishSingleFile>
  <PublishTrimmed>true</PublishTrimmed>
  <PublishReadyToRun>true</PublishReadyToRun>

Other Language Improvements

Other .NET Core Platform Improvements