C Sharp: Difference between revisions
Jump to navigation
Jump to search
Line 130: | Line 130: | ||
==Built-in Json Support== | ==Built-in Json Support== | ||
Adds support similar to NewtownSoft but does lack features. Just some key reminders in the code below. Google examples | |||
<syntaxhighlight lang="C#"> | |||
// 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); | |||
</syntaxhighlight> | |||
==Windows Desktop Support== | ==Windows Desktop Support== | ||
==Build and Deploy Improvements== | ==Build and Deploy Improvements== | ||
==Other Language Improvements== | ==Other Language Improvements== | ||
==Other .NET Core Platform Improvements== | ==Other .NET Core Platform Improvements== |
Revision as of 02:18, 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);