System.Memory<T> 和 System.ReadOnlyMemory<T>。
如果没有这些类型,那么在作为数组的一部分或内存缓冲区的一部分传递此类项时,必须在将数据的某些部分传递给方法之前复制该数据部分。 这些类型提供了该数据的虚拟视图,无需额外的内存分配和复制操作。
下面的示例使用 Span<T> 和 Memory<T> 实例来提供一个数组 10 个元素的虚拟视图。
using System;
class Program
static void Main()
int[] numbers = new int[100];
for (int i = 0; i < 100; i++)
numbers[i] = i * 2;
var part = new Span<int>(numbers, start: 10, length: 10);
foreach (var value in part)
Console.Write($"{value} ");
// The example displays the following output:
// 20 22 24 26 28 30 32 34 36 38
Module Program
Sub Main()
Dim numbers As Integer() = New Integer(99) {}
For i As Integer = 0 To 99
numbers(i) = i * 2
Dim part = New Memory(Of Integer)(numbers, start:=10, length:=10)
For Each value In part.Span
Console.Write($"{value} ")
End Sub
End Module
' The example displays the following output:
' 20 22 24 26 28 30 32 34 36 38
Brotli 压缩
.NET Core 2.1 添加了对 Brotli 压缩和解压缩的支持。 Brotli 是在 RFC 7932 中定义的通用无损压缩算法,并且大多数 Web 浏览器和主 Web 服务器都提供支持。 可以使用基于流的 System.IO.Compression.BrotliStream 类或基于范围的高性能 System.IO.Compression.BrotliEncoder 和 System.IO.Compression.BrotliDecoder 类。 下面的示例用 BrotliStream 类演示压缩:
public static Stream DecompressWithBrotli(Stream toDecompress)
MemoryStream decompressedStream = new MemoryStream();
using (BrotliStream decompressionStream = new BrotliStream(toDecompress, CompressionMode.Decompress))
decompressionStream.CopyTo(decompressedStream);
decompressedStream.Position = 0;
return decompressedStream;
Public Function DecompressWithBrotli(toDecompress As Stream) As Stream
Dim decompressedStream As New MemoryStream()
Using decompressionStream As New BrotliStream(toDecompress, CompressionMode.Decompress)
decompressionStream.CopyTo(decompressedStream)
End Using
decompressedStream.Position = 0
Return decompressedStream
End Function
BrotliStream 行为等同于 DeflateStream 和 GZipStream,这样就可以轻松地将调用这些 API 的代码转换为 BrotliStream。
新加密 API 和加密改进
.NET Core 2.1 包括加密 API 的许多增强功能:
System.Security.Cryptography.Pkcs.SignedCms 在 System.Security.Cryptography.Pkcs 包中提供。 其实现与 .NET Framework 中的 SignedCms 类相同。
X509Certificate.GetCertHash 和 X509Certificate.GetCertHashString 方法的新重载接受一个哈希算法标识符,使调用方能够使用除 SHA-1 以外的算法获得证书指纹值。
新的基于 Span<T> 的加密 API 可用于哈希、HMAC、加密随机数生成、非对称签名生成、非对称签名处理和 RSA 加密。
通过使用基于 Span<T> 的实现,System.Security.Cryptography.Rfc2898DeriveBytes 的性能提高了大约 15%。
新 System.Security.Cryptography.CryptographicOperations 类包括两个新方法:
FixedTimeEquals 需要固定时间来返回任意两个长度相同的输入,这使得它适用于加密验证,从而避免提供计时旁道信息。
ZeroMemory 是不能进行优化的内存清理例程。
静态 RandomNumberGenerator.Fill 方法用随机值填充 Span<T>。
System.Security.Cryptography.Pkcs.EnvelopedCms 现在在 Linux 和 macOS 上受支持。
System.Security.Cryptography.ECDiffieHellman 类系列现提供椭圆曲线 Diffie-Hellman (ECDH)。 外围应用与 .NET Framework 中相同。
RSA.Create 返回的实例可以使用 SHA-2 摘要对 OAEP 进行加密或解密,并使用 RSA-PSS 生成或验证签名。
套接字改进
.NET Core 包括一个新类型 System.Net.Http.SocketsHttpHandler 和重写的 System.Net.Http.HttpMessageHandler,两者构成了更高级别网络 API 的基础。 例如,System.Net.Http.SocketsHttpHandler 是 HttpClient 实现的基础。 在以前版本的 .NET Core 中,更高级别的 API 基于本机网络实现。
.NET Core 2.1 中引入的套接字实现具有很多优点:
对照以前的实现,可以看到显著的性能改进。
消除平台依赖项,从而简化部署和维护。
在所有 .NET Core 平台之间保持行为一致。
SocketsHttpHandler 是 .NET Core 2.1 中的默认实现。 但是,你可以通过调用 AppContext.SetSwitch 方法配置应用程序以使用较旧的 HttpClientHandler 类:
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", False)
还可以使用环境变量选择退出使用基于 SocketsHttpHandler 的套接字实现。 为此,需要将 DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER
设置为 false
或 0。
在 Windows 上,还可以选择使用 System.Net.Http.WinHttpHandler后者依赖于本机实现),或者通过将类实例传递到 HttpClient 构造函数来使用 SocketsHttpHandler 类。
在 Linux 和 macOS 上,可以在每个进程的基础上仅配置 HttpClient。 在 Linux 上,如果想要使用旧的 HttpClient 实现,则需要部署 libcurl。 (它随 .NET Core 2.0 一起安装。)
有关中断性变更的信息,请参阅从版本 2.0 迁移到 2.1 的中断性变更。
.NET Core 3.1 的新增功能
EF Core 2.1 中的新增功能
ASP.NET Core 2.1 的新增功能