.NET 11 Preview 3 Deep Dive: C# 15 Union Types Completed, Kestrel Throughput Up to 40% Faster

.NET 11 Preview 3 delivers platform-wide upgrades across the language, runtime, and web stack. It directly addresses pain points such as the incomplete C# 15 Union Type experience, the high adoption barrier for async runtime features, fragmented JSON and compression capabilities, and insufficient Kestrel throughput under heavy load. Keywords: .NET 11, C# 15, Kestrel.

Technical Specification Snapshot

Parameter Details
Language C# 15, .NET 11
Protocols/Scenarios HTTP, WebAssembly, JSON, OpenTelemetry
GitHub Stars Not provided in the source
Core Dependencies ASP.NET Core, EF Core, System.Text.Json, System.IO.Compression

.NET 11 Preview 3 has moved from isolated optimizations to platform-level enhancement

.NET 11 Preview 3 spans the Runtime, SDK, ASP.NET Core, C# 15, EF Core, and WebAssembly. It is not a simple patch set. It is a coordinated upgrade focused on performance, developer experience, and AI integration.

For developers, the most immediate value appears in three areas: more complete language capabilities, lower runtime overhead, and a web and cloud-native stack that fits high-concurrency and intelligent workloads more naturally. That makes this preview meaningfully ready for early evaluation.

.NET 11 Preview 3 is now available! AI Visual Insight: This image shows the official .NET 11 Preview 3 release banner and emphasizes that the release has entered an evaluation-ready stage. The visual focus is the version name and release date, which makes it useful as a version anchor for technology roadmap updates rather than as a feature-detail diagram.

C# 15 Union Types finally complete the engineering workflow

Preview 2 already introduced compiler support for Union Types, but Preview 3 fills in the IDE workflow with IntelliSense, navigation, and refactoring support. These improvements may look subtle, but they directly influence whether teams will adopt the syntax in real projects.

At the moment, you still need to manually include UnionAttribute and the IUnion polyfill. In other words, the syntax direction is now clear, but a small amount of boilerplate still remains before general availability.

// Define a result union type: either success or failure
union Result
<T>
{
    Success(T Value);      // Success branch carrying the result value
    Error(string Message); // Failure branch carrying the error message
}

// During pattern matching, the compiler requires all branches to be handled

This code shows the core value of C# 15 Union Types: using the type system to replace fragile state conventions.

Runtime optimizations are already affecting throughput, memory, and observability

Runtime Async in Preview 3 no longer depends on EnablePreviewFeatures. You can enable it simply by setting runtime-async=on. This lowers the barrier to adopting native async support in NativeAOT and ReadyToRun scenarios.

The main benefit is that async continuation objects can be reused, which reduces allocation pressure under high request volume and produces cleaner stack traces. These changes matter especially for cloud functions, microservices, and gateway-style services.

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>

<TargetFramework>net11.0</TargetFramework>
    <RuntimeHostConfigurationOption Include="runtime-async" Value="on" />
  </PropertyGroup>
</Project>

This configuration enables native runtime async support and works well as a performance baseline for experimenting with high-throughput services.

JIT and WebAssembly improvements target real workloads more directly

JIT improvements include switch multi-target expression folding, elimination of bounds checks for reverse indexing, and faster x86 conversions. These changes do not alter how you write business logic, but they continuously reclaim hidden waste in day-to-day code.

On the WebAssembly side, CoreCLR becomes the target runtime, and float[] and Span can cross the JavaScript boundary directly, reducing manual conversion overhead. At the same time, NativeAOT on Unix now uses the traditional lib prefix for dynamic library naming, so build scripts should be updated accordingly.

int lastTwo = values[^1] + values[^2]; // Reverse indexing where JIT can remove redundant bounds checks
bool matched = x is 0 or 1 or 2;       // Multi-target matching can be folded into a more compact execution path

This code demonstrates a typical scenario where you benefit from JIT optimization without rewriting business logic.

Base class library upgrades are reducing boilerplate in serialization and compression

System.Text.Json in Preview 3 adds JsonNamingPolicy.PascalCase and allows member-level naming policy overrides. This makes it much more natural to combine a global convention with local exceptions.

At the same time, type-level ignore condition configuration reduces the amount of model-external setup code. For enterprise applications with many DTOs, these changes can significantly reduce maintenance overhead.

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase // Use camelCase globally by default
};

// Individual members can override the naming policy or ignore condition through attributes
string json = JsonSerializer.Serialize(user, options); // Perform serialization

This example shows that JSON naming strategy is evolving from a single global rule to fine-grained model-level control.

Zstandard and lower-level I/O enhancements make data paths more robust

ZstandardStream is now officially part of System.IO.Compression, alongside GZip and Deflate in the same namespace. That means compression is shifting from an optional extension to a platform-standard capability. This becomes especially compelling for log archiving, API transport, and object storage scenarios.

In addition, automatic CRC32 validation for ZIP, SafeFileHandle.Type for handle type detection, and RandomAccess support for non-seekable handles all improve low-level reliability. These updates may not look flashy, but they are critical for diagnostics and fault tolerance.

ASP.NET Core and SDK improvements are now strong enough for teams to try early

At the SDK level, you can now work directly with .slnf files, and dotnet run -e lets you pass environment variables from the command line. These additions reduce IDE dependency and make automation scripts and CI workflows more convenient.

The most notable improvement remains Kestrel. In scenarios such as port scanning or misconfigured clients, throughput improves by 20% to 40%. This is not just a laboratory benchmark. It is a gain that high-concurrency services can feel in practice.

# Inject an environment variable directly into the running process
(dotnet run -e ASPNETCORE_ENVIRONMENT=Staging)

# Run a command against a solution filter
(dotnet sln MyApp.slnf add src/MyApi/MyApi.csproj)

These commands show that the .NET CLI continues to evolve toward engineering automation and large-solution management.

AI and cloud-native have become the default direction of .NET evolution

Preview 3 sends two clear signals. First, AI invocation capabilities are moving into a unified abstraction layer, which should let developers switch more easily between the OpenAI API and local models. Second, cloud-native is no longer an add-on capability. It is becoming a platform default.

Native OpenTelemetry integration, stronger container and Kubernetes support, .NET Aspire microservice orchestration, and BFloat16 numeric capabilities all show that .NET is expanding to serve both traditional enterprise applications and AI workloads.

This preview is best evaluated first by three types of teams

The first group is high-concurrency web teams, which can directly validate the combined gains from Kestrel, Runtime Async, and JIT. The second group is platform teams, which can define early standards around Union Types, JSON policy, and CLI automation. The third group is AI or cloud-native teams, which can evaluate unified model integration and observability paths ahead of time.

If you are currently running on .NET 8 or the .NET 10 preview track, .NET 11 Preview 3 is already worth moving into an experimental environment instead of continuing to wait.

FAQ

1. Which .NET 11 Preview 3 features should I validate first?

Prioritize Kestrel throughput gains, Runtime Async, and JIT optimizations, because they are the easiest to measure in existing services.

2. Are C# 15 Union Types ready for production?

They are better suited for technical exploration and internal pilots. The semantic direction is clear, but the current need for a polyfill means teams should still limit adoption scope before general availability.

3. What practical value does this update provide for AI developers?

The main value comes from a unified model invocation direction, BFloat16 support, and stronger cloud-native observability, all of which can reduce the complexity of AI service integration and deployment.

Core Summary

This article systematically reviews the key upgrades in .NET 11 Preview 3, including completed IDE support for C# 15 Union Types, simplified Runtime Async enablement, JIT optimizations, enhancements in System.Text.Json, official Zstandard integration, Kestrel throughput gains, and the broader shift toward AI and cloud-native development.