Table of Contents
Microsoft has now released the latest version of .NET 7 on 8th November 2022. Prepare yourself to embrace the updates coming with it!
Here we bring such legitimate striking features that make .NET 7 more efficient and promising than the previous versions.
But before we dwell on the modifications that will enhance working with .NET, let us understand how the release cycle for .NET comes up with different versions.
The Ultimate Checklist for Building An Incredible Web App
Get your free copy
.NET Release Modulation
Every product from Microsoft comes with its lifecycle. This begins with its release and ends when it is no longer supported. Now why it becomes important to know the details of releasing dates. It is simple. The awareness of the release dates can guide you in deciding when to upgrade your software and make some necessary changes to it.
All the even-numbered releases are covered under a Long Term Support (LTS) policy. Precisely, these .NET releases get free support and patches for three years. Whereas the odd-numbered releases get free support and patches for 18 months.
What’s new in .NET 7?
For .NET 7 updates, there is a total of 7 previews announced till now with modifying and supplementing .NET 7 features. Let us take a look at certain noteworthy .NET 7 features, as announced through .NET 7 update announcement.
#1 Native-AOT
Simply as its name suggests, Ahead-Of-Time generates code at compile-time instead of run-time but on Native. This is not completely a new concept. Previously, we were offered with ReadyToRun for client-server applications and Mono AOT for mobile and WASM applications. These technologies are not replaced by Native AOT, however, offer a new set of potentials that will bring full native pre-compilation to .NET desktop client and server scenarios.
Using Native AOT benefits in various ways, as it solicits lower memory usage and restricts platform access with reduced disk size, making for faster startup time. These are showcased by promising numbers in the terms of compilation speed and size.
#2 ASP.NET Core
A lot came down in ASP.NET core development.
Additional performance improvements make it faster and more efficient. .NET 6 already had a massive impact on performance, and .NET 7 has taken it even further. That being so, .NET 7 updates widely enhances the .NET 7 performance. Although you might not run into performance issues today, you can save your money without altering your source code when running on the cloud.
- HTTP 3 is a preview feature in .NET 6 and is enabled by default in .NET 7. There are additional TLS features and other performance improvements.
- Minimal APIs allow the creation of lightweight web APIs without the overhead of controllers. This was introduced in .NET 6. With .NET 7 we get additional improvement and support for currently missing features like grouping endpoints with a common route prefix. These endpoint filters allow the implementation of crosscutting concerns that could be only done by controllers using action filters in the current version.
- Blazor Hybrid Support will allow take the existing blazor components and put them into a desktop application using a web view control with access to all underlying hardware APIs. This will also allow developers to use web technologies to build desktop applications with access to system resources like a local file system or a webcam. There will be web view control for Windows Forms and WPF application that allows for modernization of the existing applications and integration of new blazor components into an existing application.
#3 The new Regex Source Generator
The new feature Regex Source Generator brings all the .NET 7 performance benefits from the compiled engine without the startup cost, with additional benefits like a great dubbing experience and being trimming-friendly.
For the purpose to start using it, you only need to turn the containing type into a partial one and declare a new partial method with the RegexGenerator attribute that will return the optimized Regex object, and that’s it!
The source generator will fill the implementation of that method by itself. And will also get updated automatically as you make changes to your pattern or to the additional options that you pass in. Here is an example:
Before:
public class Foo
{
public Regex regex = new Regex(@"abc|def", RegexOptions.IgnoreCase);
public bool Bar(string input){
bool isMatch = regex.IsMatch(input);
// ..
}
}
After:
public partial class Foo // <-- Make the class a partial class
{
[RegexGenerator(@"abc|def", RegexOptions.IgnoreCase)] // <-- Add the RegexGenerator attribute and pass in your pattern and options
public static partial Regex MyRegex(); // <-- Declare the partial method, which will be implemented by the source generator
public bool Bar(string input){
bool isMatch = MyRegex().IsMatch(input); // <– Use the generated engine by invoking the partial method.
// ..
}
}
#4 .NET MAUI
It is the new cross-platform native UI development toolkit for .NET and is a part of .NET 7. Currently, .NET MAUI preview 13 was released.
In .NET 7 there are some tooling and performance improvements for .NET MAUI development. Some other stories included are:
- Map control
- DualScreen Controls
- Improve “Getting Started”
- Improve UI responsiveness
- Improve app startup and app size
- Migration assistant from Xamarin projects
- Improve native library interop
Read here, to understand the detailed .NET 7 roadmap for .NET MAUI.
#5 Cloud-native
In .NET 7, the focus is on the developer’s journey toward cloud-native application specifically improving two points.
- Simplify the setup and configuration necessary to implement secure authentication and authorization
- Improving the performance of the application startup and runtime execution
There are investments in Orleans, a .NET cross-platform framework for building distributed applications. The following points are targeted for modification.
- Implement POCO grains
- Configurable serializers for grain persistence
- Remove SMS provider
- Implement stateless service abstractions
- Implement workflows as a primitive in Orleans
- Improve the experience for Orleans customers deploying to Azure
- Simplify stream configuration abstractions
- Add Orleans template for aspnetcore
There is a consideration to simplify and improve the developer experience building and deploying containerized .NET applications.
It provides APIs to allow adding a single object instance to the System.Composition.Hosting container. This is similar to the functionality rendered in the legacy interfaces System.ComponentModel.Composition.Hosting with the API ComposeExportedValue(CompositionContainer, T)
namespace System.Composition.Hosting
{
public class ContainerConfiguration
{
public ContainerConfiguration WithExport(TExport exportedInstance);
public ContainerConfiguration WithExport(TExport exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
public ContainerConfiguration WithExport(Type contractType, object exportedInstance);public ContainerConfiguration WithExport(Type contractType, object exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
}
}
#6 Generic Math
Generic Math associates the power of generics and a new feature known as static virtuals in interfaces to allow .NET developers to take advantage of static APIs, including operators, from generic code.
This denotes that you get all the power of generics, along with the ability to constrain the input to number-like types. This means that you no longer need to write or maintain many near-identical implementations just to support multiple types.
It also intimates that you get access to all your favorite operators and can use them from generic contexts. That is, you can now have static T Add<T>(T left, T right) where T : INumber<T> => left + right; whereas previously it would have been impossible to define.
public static TResult Sum<T, TResult>(IEnumerable values)
where T : INumber
where TResult : INumber
{
TResult result = TResult.Zero;
foreach (var value in values){
result += TResult.Create(value);
}
return result;}
public static TResult Average<T, TResult>(IEnumerable values)where T : INumber
where TResult : INumber {
TResult sum = Sum<T, TResult>(values);
return TResult.Create(sum) / TResult.Create(values.Count());
}
public static TResult StandardDeviation<T, TResult>(IEnumerable values)where T : INumber
where TResult : IFloatingPoint {
TResult standardDeviation = TResult.Zero;
if (values.Any()){
TResult average = Average<T, TResult>(values);
TResult sum = Sum<TResult, TResult>(values.Select((value) => {
var deviation = TResult.Create(value) – average;
return deviation * deviation;
}));
standardDeviation = TResult.Sqrt(sum / TResult.Create(values.Count() – 1));
}
return standardDeviation;}
#7 Add Stream ReadExactly and ReadAtLeast
One of the most common mistakes when using Stream.Read() is that the programmer doesn’t realize that Read() may return less data than what is available in the Stream and less data than the buffer being passed in.
And even for programmers who are aware of this, it is annoying to write the same loop every single time they want to read from a Stream.
To help this situation, Microsoft has added new methods to the base System.IO.Stream class:
namespace System.IO;
public partial class Stream
{
public void ReadExactly(Span<byte> buffer);
public void ReadExactly(byte[] buffer, int offset, int count);
public ValueTask ReadExactlyAsync(Memory buffer, CancellationToken cancellationToken = default);
public ValueTask ReadExactlyAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken = default);
public int ReadAtLeast(Span buffer, int minimumBytes, bool throwOnEndOfStream = true);
public ValueTask ReadAtLeastAsync(Memory buffer, int minimumBytes, bool throwOnEndOfStream = true, CancellationToken cancellationToken = default);
}
The new ReadExactly methods assure to read exactly the number of bytes requested. EndOfStreamException will be thrown, if the Stream ends before the requested bytes have been read.
Other modifications for .NET 7 release
Below are the other enhancements that are seen as .NET 7 features
Observability
- Adding the overload to ActivityContext.TryParse will allow parsing and creating an ActivityContext object including if the activity context was propagated from a remote parent.
- Adding the method Activity.IsStopped() to indicate whether the Activity object is stopped.
- Introducing Activity.Current change event
- Expose performant Activity properties enumerator methods
- Expose performant ActivityEvent and ActivityLink tags enumerator methods
The Ultimate Checklist for Building An Incredible Web App
Get your free copy
Using IMemoryCache.GetCurrentStatistics() for one memory cache
To incorporate a single memory cache Use AddMemoryCache API and via DI get it injected to enable them to call GetCurrentStatistics.
Using IMemoryCache.GetCurrentStatistics() for multiple memory caches
Intending to get stats for more than one memory cache in the app, the user may use metrics APIs in their own code, so long as they have a way of differentiating their caches by name or ID.
Startup time improvements with Write-Xor-Execute enabled
- For .NET 7, to significantly reduce the number of post-creation modifications of executable code in runtime, the precode was reimplemented. This resulted in 10 – 15 % startup time improvements.
- As a bonus, this change also resulted in steady-state performance improvements (up to 8%) in some microbenchmarks and some ASPNet Benchmarks even without Write-Xor-Execute enabled.
- However, there were a few regressions resulting from that change too (without Write-Xor-Execute enabled) that are addressed in the releases. These observations were found in the Orchard and Fortunes benchmarks on Intel processors only.
Polymorphism
System.Text.Json now favors serializing and deserializing polymorphic type hierarchies utilizing attribute annotations. This configuration allows polymorphic serialization for Base, particularly when the runtime type is Derived. It is important to note that this does not enable polymorphic deserialization since the payload would be roundtripped as Base.
Modernize JIT
In .NET 7 release there has been a lot of work out on the internals of the JIT, cleaning up the JIT’s intermediate representation and removing limitations as a result of old design decisions. This has resulted in less memory usage and higher throughput of the JIT itself, and also enhanced the code quality.
System.Formats.Tar API updates
- A new class was added to describe a GEA entry, as it was also discovered that GEA entries should not be expected only in archives containing PAX entries exclusively: they can be revealed in archives that intermix entries of different formats.
- After recognizing that entries of different formats can be intermixed in a single TAR archive, the TarFormat enum was renamed to TarEntryFormat
- The Format property was eliminated from TarReader as no archive is expected to have all its entries in a single format.
Winding-up
Just like everything else in technology, .NET also had to be updated. The new enhancements and additional .NET 7 features of the platform up-gradation are, open-sources and cross-platform. This ideology is enabling Microsoft to maintain a good position even in the future.
.NET update in the form of .NET 7 is released on 8th November 2022. And looking at the features mentioned here, this seems to be a big success.
So if you plan to shift your apps to .NET 7, need not worry, you can hire expert .NET developers from Ace Infoway. Our .NET developers will guide you with a detailed and strategic roadmap to create compelling and easy-to-use apps.
Team up with us to get started!