***1。パフォーマンス向上 **
.NET 8 在整个堆栈中带来了数千项性能改进 。默认情况下会启用一种名为动态配置文件引导优化 (PGO) 的新代码生成器,它可以根据实际使用情况优化代码,并且可以将应用程序的性能提高高达 20%。现在支持的 AVX-512 指令集能够对 512 位数据向量执行并行操作,这意味着可以在更短的时间内处理更多的数据。原始类型(数字及其他类型)现在实现了新的可格式化和可解析接口,这使它们能够直接格式化和解析为 UTF-8,而无需任何转码开销。

2. NET Aspire
NET Aspireは、. NETを使用して回復力があり、観測可能で設定可能なクラウドネイティブアプリケーションを構築するためのスタックです。デフォルトでは、テレメトリ、レジリエンス、プロビジョニング、ヘルスチェックなど、クラウドネイティブ向けに強化された選択されたコンポーネントセットが含まれています。洗練されたシンプルなネイティブ開発者エクスペリエンスと組み合わせることで、. NET Aspireは、クラウドネイティブアプリケーションの基本的な依存関係を1日目と100日目に簡単に検出、取得、設定できます。
NET Aspireのプレビューはこちらをご覧ください。(ウェブマスター注:これはリンクがありませんが、補足を見つける方法を参照してください)

※ 3。NET 8コンテナの拡张より安全性、コンパクト性、効率性 **
使用 .NET 比以往更轻松、更安全地使用容器打包应用程序。每个 .NET 映像都包含一个非 root 用户,从而通过单行配置启用更安全的容器。.NET SDK 工具无需 Dockerfile 即可发布容器映像,并且默认情况下是非 root 的。由于 .NET 基础映像更小,因此可以更快地部署容器化应用程序 - 包括我们映像的新实验变体,这些变体可为本机 AOT 提供真正最小的应用程序大小。选择使用新的 Chiseled Ubuntu 映像变体进行更多安全强化,以进一步减少攻击面。使用 Dockerfile 或 SDK 工具,为任何架构构建应用程序和容器映像。

**4。ネイティブAoTより高密度で持続可能なコンピューティングへの道のり **
JITコンパイラが実行時にコードをコンパイルするのを待つ必要はありません。JITコンパイラとILコードのデプロイは不要です。AOTアプリケーションは、アプリケーションに必要なコードのみをデプロイします。JITコンパイラを使用できない制限された環境でアプリケーションを実行できるようになりました。

【5】。人工知能AIを. NETアプリケーションに統合 **
生成式人工智能和大型语言模型正在改变人工智能领域,使开发人员能够在其应用程序中创建独特的人工智能体验。.NET 8 可以通过 .NET SDK 中一流的开箱即用 AI 功能以及与多种工具的无缝集成来轻松利用 AI。
NET 8では、Tensor Primitivesの統合など、ジェネレーティブAIワークロードとの互換性を向上させるためのいくつかの機能強化がライブラリに導入されました。AIアプリケーションの台頭に伴い、新しいツールやSDKが登場しました。Azure Open AI、Azure Cognitive Search、Milvus、Qdrant、Microsoft Teamsなどの社内外の多くのパートナーと協力して、. NET開発者がそれぞれのSDKを通じて幅広いAIモデル、サービス、プラットフォームに簡単にアクセスできるようにしています。さらに、オープンソースのセマンティックカーネルSystem.Numerics SDKは、これらのAIコンポーネントを新規および既存のアプリケーションと統合し、革新的なユーザーエクスペリエンスを提供するのに役立ちます。
開発者が簡単に始められるように、さまざまな例やリファレンステンプレート、デモンストレーションパターン、プラクティスが利用できます。

**6。Blazor. NETでフルスタックWebアプリケーションを構築する **
NET 8のBlazorは、サーバーとクライアントを同時に使用して、すべてのWeb UIニーズを処理できます。これはフルスタックWeb UIです!ページのロード時間、スケーラビリティ、ユーザーエクスペリエンスの最適化に焦点を当てたいくつかの新しい機能強化により、開発者はBlazor ServerとBlazor Web Assemblyを同じアプリケーション内で使用し、実行時にユーザーをサーバーからクライアントに自動的に移動できるようになりました。新しい“Jiterpreter”ベースのランタイムと新しい組み込みコンポーネントにより、. NETコードはWeb Assembly上で大幅に高速に実行されます。. NET 8での認証、認可、アイデンティティ管理の強化の一環として、Blazorは完全なBlazorベースのアイデンティティUIの生成をサポートします。

【7】。NET MAUI:パフォーマンス、信頼性、開発者エクスペリエンスを向上 **
NET MAUIは、Win UI、Mac Catalyst、iOS、Androidアプリケーションを構築するための単一のプロジェクトシステムと単一のコードベースを提供します。ネイティブAOT(実験的)はiOSライクプラットフォームをサポートしました。. NET MAUI用の新しいVisual Studio Code拡張機能は、クロスプラットフォームの. NETモバイルおよびデスクトップアプリケーションを開発するために必要なツールを提供します。Xcode 15とAndroid API 34がサポートされ、最新バージョンのiOSとAndroidをターゲットにできます。パフォーマンス、コントロール、UI要素、プラットフォーム固有の動作において、大幅な品質向上が行われました。デスクトップインタラクションのクリック処理の改善、キーリスナーなどが追加されました。

【8】。C#12の构文の化により开発者の性を向上 **
C#12はコーディング体験をより効率的で楽しくします。シンプルでエレガントな構文を使用して、任意のクラスや構造体にプライマリコンストラクタを作成できます。フィールドとプロパティを初期化するためのテンプレートコードは不要です。配列、スパン、その他のコレクション型を簡潔で表現力豊かな構文で作成すると嬉しいです。ラムダ式のパラメータに新しいデフォルト値を使用します。オプションパラメータを処理するオーバーロードやnullチェックは不要です。using aliasディレクティブを使用して、名前付き型だけでなく、任意の型にエイリアスを追加することもできます。
(8.1)コレクションの表現 **
在 C# 12 之前,创建集合需要针对不同场景使用不同的语法。初始化List<int>、int[]、Span<int>所需不同的语法。以下是创建集合的几种方法:
int[] x1 = new int[] { 1, 2, 3, 4 };
int[] x2 = Array.Empty<int>();
WriteByteArray(new[] { (byte)1, (byte)2, (byte)3 });
List<int> x4 = new() { 1, 2, 3, 4 };
Span<DateTime> dates = stackalloc DateTime[] { GetDate(0), GetDate(1) };
WriteByteSpan(stackalloc[] { (byte)1, (byte)2, (byte)3 });
【8.2】任意のクラスまたは構造体の主コンストラクタ ***
C#12ではメインコンストラクタが拡張され、レコードだけでなくすべてのクラスと構造体に適用された。メインコンストラクタでは、クラス宣言時にコンストラクタ引数を定義できます。
public class BankAccount(string accountID, string owner)
{
public string AccountID { get; } = accountID;
public string Owner { get; } = owner;
public override string ToString() => $"Account ID: {AccountID}, Owner: {Owner}";
}
主コンストラクタ引数の最も一般的な用途は次のとおりです。
- baseコンストラクタの引数として呼び出されます。
- メンバー·フィールドまたはプロパティを初期化します。
- インスタンスメンバー内のコンストラクタ引数を参照します。
- 依存注入のテンプレートを削除します。
【8.3】任意のタイプ **
エイリアス型は、コードから複合型署名を削除する便利な方法です。using C#12以降、他の型はエイリアスディレクティブで有効になります。たとえば、これらのエイリアスは以前のバージョンのC#では無効です。
using intArray = int[]; // Array types.
using Point = (int x, int y); // Tuple type
using unsafe ArrayPtr = int*; // Pointer type (requires "unsafe")
^『 8.4。ラムダパラメータ **
C#12以降、ラムダ式でデフォルトパラメータを宣言できるようになりました。
var IncrementBy = (int source, int increment = 1) => source + increment;
Console.WriteLine(IncrementBy(5)); // 6
Console.WriteLine(IncrementBy(5, 2)); // 7
^『 8.5。内部配列 **
运行时团队和其他库作者使用内联数组来提高应用的性能。 内联数组使开发人员能够创建固定大小的 struct 类型数组。 具有内联缓冲区的结构应提供类似于不安全的固定大小缓冲区的性能特征。 你可能不会声明自己的内联数组,但当它们从运行时 API 作为 System.Span 或 System.ReadOnlySpan 对象公开时,你将透明地使用这些数组。
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
}
使用方法は他の配列と同様です:
var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
buffer[i] = i;
}
foreach (var i in buffer)
{
Console.WriteLine(i);
}
区别在于编译器可以利用有关内联数组的已知信息。 你可能会像使用任何其他数组一样使用内联数组。 有关如何声明内联数组的详细信息,请参阅有关 struct 类型的语言参考。
【9】。反射の改善 **
.NET 5 中引入了函数指针,但当时未添加对反射的相应支持。 对函数指针使用 typeof 或反射时(例如分别使用 typeof(delegate*<void>()) 或 FieldInfo.FieldType),返回了 IntPtr。 从 .NET 8 开始,将改为返回 System.Type 对象。 此类型提供对函数指针元数据的访问,包括调用约定、返回类型和参数。
新功能目前仅在 CoreCLR 运行时和 MetadataLoadContext 中实现。已将新的 API 添加到 System.Type(例如 IsFunctionPointer)以及 System.Reflection.PropertyInfo、System.Reflection.FieldInfo 和 System.Reflection.ParameterInfo。 以下代码演示如何使用一些新 API 进行反射。
// Sample class that contains a function pointer field.
public unsafe class UClass
{
public delegate* unmanaged[Cdecl, SuppressGCTransition]<in int, void> _fp;
}
// ...
FieldInfo fieldInfo = typeof(UClass).GetField(nameof(UClass._fp));
// Obtain the function pointer type from a field.
Type fpType = fieldInfo.FieldType;
// New methods to determine if a type is a function pointer.
Console.WriteLine($"IsFunctionPointer: {fpType.IsFunctionPointer}");
Console.WriteLine($"IsUnmanagedFunctionPointer: {fpType.IsUnmanagedFunctionPointer}");
// New methods to obtain the return and parameter types.
Console.WriteLine($"Return type: {fpType.GetFunctionPointerReturnType()}");
foreach (Type parameterType in fpType.GetFunctionPointerParameterTypes())
{
Console.WriteLine($"Parameter type: {parameterType}");
}
// Access to custom modifiers and calling conventions requires a "modified type".
Type modifiedType = fieldInfo.GetModifiedFieldType();
// A modified type forwards most members to its underlying type.
Type normalType = modifiedType.UnderlyingSystemType;
// New method to obtain the calling conventions.
foreach (Type callConv in modifiedType.GetFunctionPointerCallingConventions())
{
Console.WriteLine($"Calling convention: {callConv}");
}
// New method to obtain the custom modifiers.
foreach (Type modreq in modifiedType.GetFunctionPointerParameterTypes()[0].GetRequiredCustomModifiers())
{
Console.WriteLine($"Required modifier for first parameter: {modreq}");
}
エクスポート:
IsFunctionPointer: True
IsUnmanagedFunctionPointer: True
Return type: System.Void
Parameter type: System.Int32&
Calling convention: System.Runtime.CompilerServices.CallConvSuppressGCTransition
Calling convention: System.Runtime.CompilerServices.CallConvCdecl
Required modifier for first parameter: System.Runtime.InteropServices.InAttribute
*10。ソースビルダーの
NET 8では、ASP.NET CoreでAOTとカスタマイズに適した構成を提供するソースジェネレータが導入された。このジェネレータは、既存の反射ベースの実装に代わる方法である。
源生成器探测 Configure(TOptions)、Bind 和 Get 调用来从中检索类型信息。 在项目中启用生成器后,编译器将隐式选择生成的方法,而非预先存在的基于反射的框架实现。
ソースコードを変更することなくジェネレータを使用できます。このジェネレータはAOT Webアプリケーションでデフォルトで有効になります。その他のプロジェクトタイプでは、ソースビルダーはデフォルトでオフになりますが、プロジェクトファイルのEnableConfigurationBindingGeneratorプロパティをtrueに設定することで使用することができます。
<PropertyGroup>
<EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator>
</PropertyGroup>
次のコードは、バインダを呼び出す例を示します。
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
IConfigurationSection section = builder.Configuration.GetSection("MyOptions");
// !! Configure call - to be replaced with source-gen'd implementation
builder.Services.Configure<MyOptions>(section);
// !! Get call - to be replaced with source-gen'd implementation
MyOptions options0 = section.Get<MyOptions>();
// !! Bind call - to be replaced with source-gen'd implementation
MyOptions options1 = new MyOptions();
section.Bind(options1);
WebApplication app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
public class MyOptions
{
public int A { get; set; }
public string S { get; set; }
public byte[] Data { get; set; }
public Dictionary<string, string> Values { get; set; }
public List<MyClass> Values2 { get; set; }
}
public class MyClass
{
public int SomethingElse { get; set; }
}
**11。Androidアプリ用のAOTコンパイル **
为了减小应用大小,面向 Android 的 .NET 和 .NET MAUI 应用在发布模式下构建时使用分析的预先 (AOT) 编译模式。 与常规 AOT 编译相比,分析的 AOT 编译所影响的方法更少。 .NET 8 引入了 <AndroidStripILAfterAOT> 属性,你可使用它进一步对 Android 应用进行 AOT 编译,从而更进一步减少应用大小。
<PropertyGroup>
<AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
</PropertyGroup>
デフォルトでは、Android StripILafterAOTをtrueに設定すると、デフォルトのAndroid EnableProfiledAot設定が置き換えられ、AOTでコンパイルされた(ほぼ)すべてのメソッドをトリミングできます。両方のプロパティを明示的にtrueに設定することで、解析されたAOTとILストライピングを併用することもできます。
<PropertyGroup>
<AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
<AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>
*** コード解析 ***
NET 8には、. NETライブラリAPIの適切かつ効率的な使用を検証するための新しいコードアナライザと修正が含まれます。次の表は、新しいアナライザの概要です。
| ルールID | カテゴリー:Category | 説明書の作成 |
|---|---|---|
| CA1856 | パフォーマンス | 未在参数上正确应用 ConstantExpectedAttribute 属性时触发。 |
| CA1857 | パフォーマンス | 当参数使用 ConstantExpectedAttribute 添加批注但提供的参数不是常量时触发。 |
| CA1858 | パフォーマンス | 若要确定字符串是否以给定前缀开头,最好调用 String.StartsWith,而不是调用 String.IndexOf,然后将结果与零进行比较。 |
| CA1859 | パフォーマンス | この規則では、特定のローカル変数、フィールド、プロパティ、メソッド引数、メソッド戻り値の型を、インタフェースや抽象型から、可能な限り具体型にアップグレードすることを推奨します。特定の型を使用すると、より高品質なコードが生成されます。 |
| CA1860 | パフォーマンス | 若要确定集合类型是否具有任何元素,最好使用 Length、Count 或 IsEmpty,而不是调用 Enumerable.Any。 |
| CA1861 | パフォーマンス | 繰り返し呼び出しを行うと、引数として渡された定数配列は再利用されません。つまり、毎回新しい配列が作成されます。パフォーマンスを向上させるには、配列を静的読み取り専用フィールドにフェッチすることを検討してください。 |
| CA1865-CA1867 | パフォーマンス | 単一文字列の場合、charオーバーロードの方がパフォーマンスが優れています。 |
| CA2021 | 信頼性は | Enumerable.Cast(IEnumerable) 和 Enumerable.OfType(IEnumerable) 需要兼容的类型才能正常运行。 泛型类型不支持扩大转换和用户定义的转换。 |
| CA1510-CA1513 | 保守性の向上 | 在构造新的异常实例方面,引发帮助程序比 if 块更简单、更高效。 这四个分析器是为以下例外情况创建的:ArgumentNullException、ArgumentException、ArgumentOutOfRangeException 和 ObjectDisposedException。 |
**13。. NET Coreライブラリ **
【13】13。抽象的な時間 *
新的 TimeProvider 类和 ITimer 接口添加了时间抽象功能,让你可以在测试方案中模拟时间。 此外,还可以使用时间抽象,通过 Task.Delay 和 Task.WaitAsync 来模拟依赖于时间进度的 Task 操作。 时间抽象支持以下基本时间操作:
- 現地時間とUTC時間の取得
- パフォーマンス測定に使用するタイムスタンプの取得
- タイマーの作成。
次のコードスニペットは、使用例を示します。
// Get system time.
DateTimeOffset utcNow = TimeProvider.System.GetUtcNow();
DateTimeOffset localNow = TimeProvider.System.GetLocalNow();
// Create a time provider that works with a
// time zone that's different than the local time zone.
private class ZonedTimeProvider : TimeProvider
{
private TimeZoneInfo _zoneInfo;
public ZonedTimeProvider(TimeZoneInfo zoneInfo) : base()
{
_zoneInfo = zoneInfo ?? TimeZoneInfo.Local;
}
public override TimeZoneInfo LocalTimeZone => _zoneInfo;
public static TimeProvider FromLocalTimeZone(TimeZoneInfo zoneInfo) =>
new ZonedTimeProvider(zoneInfo);
}
// Create a timer using a time provider.
ITimer timer = timeProvider.CreateTimer(callBack, state, delay, Timeout.InfiniteTimeSpan);
// Measure a period using the system time provider.
long providerTimestamp1 = TimeProvider.System.GetTimestamp();
long providerTimestamp2 = TimeProvider.System.GetTimestamp();
var period = GetElapsedTime(providerTimestamp1, providerTimestamp2);
【13】13。UTF 8の改善 **
如果要启用将类型的类似字符串的表示形式写出到目标范围,请在类型上实现新的 IUtf8SpanFormattable 接口。 此新接口与 ISpanFormattable 密切相关,但面向 UTF8 和 Span<byte>,而不是 UTF16 和 Span<char>。
IUtf8SpanFormattable 已在所有基元类型(以及其他)上实现,无论是面向 string、Span<char> 还是 Span<byte>,其共享逻辑完全一致。 它完全支持所有格式(包括新的“B”二进制说明符)和所有区域性。 这意味着现在可以从 Byte、Complex、Char、DateOnly、DateTime、DateTimeOffset、Decimal、Double、Guid、Half、IPAddress、IPNetwork、Int16、Int32、Int64、Int128、IntPtr、NFloat、SByte、Single、Rune、TimeOnly、TimeSpan、UInt16、UInt32、UInt64、UInt128、UIntPtr 和 Version 直接格式化为 UTF8。
新的 Utf8.TryWrite 方法向现有 MemoryExtensions.TryWrite 方法(基于 UTF16)提供基于 UTF8 的对应方法。 可以使用内插字符串语法将复杂表达式直接格式化为 UTF8 字节范围,例如:
static bool FormatHexVersion(
short major,
short minor,
short build,
short revision,
Span<byte> utf8Bytes,
out int bytesWritten) =>
Utf8.TryWrite(
utf8Bytes,
CultureInfo.InvariantCulture,
$"{major:X4}.{minor:X4}.{build:X4}.{revision:X4}",
out bytesWritten);
【13】13。暗号化 **
NET 8ではSHA-3ハッシュプリミティブのサポートが追加された。(現在、SHA-3はOpen SSLバージョン1.1.1以降およびWindows 11ビルド253 2 4以降のLinuxでサポートされています。SHA-2を使用できるAPIは、SHA-3を補完するようになりました。HMACの場合はHMACSHA 3_256、HMACSHA 3_38 4、およびHMACSHA 3_512が含まれます。HMACの場合はHMACSHA 3_256、HMACSHA 3_38 4、およびHMACSHA 3_512が含まれます。構成可能なアルゴリズムのハッシュの場合は、HashAlgorithmName.SHA 3_256、HashAlgorithmName.SHA 3_38 4、およびHashAlgorithmName.SHA 3_512が含まれます。RSA OAEP暗号化の、これにはRSAEncryptionPadding.OaepSHA3_256、RSAEncryptionPadding.OaepSHA3_384、およびRSAEncryptionPadding.OaepSHA3_512が含まれます。
次の例は、SHA3_256.IsSupportedプロパティを含むAPIを使用して、プラットフォームがSHA-3をサポートしているかどうかを判断する方法を示しています。
// Hashing example
if (SHA3_256.IsSupported)
{
byte[] hash = SHA3_256.HashData(dataToHash);
}
else
{
// ...
}
// Signing example
if (SHA3_256.IsSupported)
{
using ECDsa ec = ECDsa.Create(ECCurve.NamedCurves.nistP256);
byte[] signature = ec.SignData(dataToBeSigned, HashAlgorithmName.SHA3_256);
}
else
{
// ...
}
【13】13。ストリームベースのZipFileメソッド ***
.NET 8 包含 ZipFile.CreateFromDirectory 的新重载,通过它可以收集目录中包含的所有文件并压缩这些文件,然后将生成的 zip 文件存储到提供的流中。 同样,通过新的 ZipFile.ExtractToDirectory 重载,可提供包含压缩文件的流,并将其内容提取到文件系统中。 下面是新的重载:
namespace System.IO.Compression;
public static partial class ZipFile
{
public static void CreateFromDirectory(string sourceDirectoryName, Stream destination);
public static void CreateFromDirectory(string sourceDirectoryName, Stream destination, CompressionLevel compressionLevel, bool includeBaseDirectory);
public static void CreateFromDirectory(string sourceDirectoryName, Stream destination, CompressionLevel compressionLevel, bool includeBaseDirectory, Encoding? entryNameEncoding);
public static void ExtractToDirectory(Stream source, string destinationDirectoryName) { }
public static void ExtractToDirectory(Stream source, string destinationDirectoryName, bool overwriteFiles) { }
public static void ExtractToDirectory(Stream source, string destinationDirectoryName, Encoding? entryNameEncoding) { }
public static void ExtractToDirectory(Stream source, string destinationDirectoryName, Encoding? entryNameEncoding, bool overwriteFiles) { }
}
GrapeCity Documents for Excel GcExcelは、Office、NPOI、またはサードパーティ製アプリケーションに依存しない、. NETおよび. NET Coreプラットフォーム上のサーバーサイド高性能表コンポーネントです。 フロントエンドで表データを表示し、サーバー側で一括作成、ロード、編集、印刷、Excelドキュメントのインポート/エクスポートを行い、開発したアプリケーションにオンラインドキュメントの前後端データ同期、オンラインファイリングとサーバー側一括エクスポートと印刷を提供します。
ActiveReports是一款专注于 .NET 和 .NET Core 平台的报表控件。通过拖拽式报表设计器,可以快速地设计 Excel 表格、Word 文档、图表、数据过滤、数据钻取、精准套打等类型报表,全面满足 WinForm、ASP.NET、ASP.NET MVC、WPF 平台中各种报表的开发需要。同时,通过丰富的 API 可以灵活的实现报表创建、加载和运行时的个性化自定义需求。
Wyn 商业智能是基于葡萄城 20 多年数据分析技术积累打造的全新一代嵌入式 BI 产品,旨在提供可与应用系统深度集成的数据分析功能,能够与企业现有业务系统 OA, ERP,MES,CRM 等应用系统深度集成,整合、分析多个业务系统的数据,自助式分析业务数据、实时分析决策,全面提升企业竞争力。
Spread .NET是一个功能、布局与 Excel 高度类似的 .NET 表格控件,可全面满足 WinForm、ASP.NET、XAML 和 WinRT 等平台下表格数据处理、数据可视化开发需求。Spread .NET 支持 462 种 Excel 公式,提供可嵌入系统的类 Excel 设计器和全面开放的 API,为 .NET 开发人员构建企业级表格应用程序提供更加专业的选择。
Referenceより:
https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-8#networking
** 拡張リンク:**
如何使用 Blazor 框架在前端浏览器中导入/导出 Excel XLSX
本文是由葡萄城技术开发团队发布,转载请注明出处:葡萄城官网