FastEnum 1.8.0
dotnet add package FastEnum --version 1.8.0
NuGet\Install-Package FastEnum -Version 1.8.0
<PackageReference Include="FastEnum" Version="1.8.0" />
paket add FastEnum --version 1.8.0
#r "nuget: FastEnum, 1.8.0"
// Install FastEnum as a Cake Addin #addin nuget:?package=FastEnum&version=1.8.0 // Install FastEnum as a Cake Tool #tool nuget:?package=FastEnum&version=1.8.0
FastEnum
FastEnum 是 C#/.NET 中最快的枚举工具。比 .NET Core 快得多,甚至比类似库 Enums.NET 还要快。提供的方法都实现了 零分配,并且设计得就像 System.Enum
一样易于使用。这个库非常有用,可以显著提高您的工作效率,因为枚举是一个非常受欢迎的特性。
性能
BenchmarkDotNet=v0.13.1, OS=Windows 10.0.22000
11th Gen Intel Core i7-1165G7 2.80GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK=6.0.301
[Host] : .NET 6.0.6 (6.0.622.26707), X64 RyuJIT
ShortRun : .NET 6.0.6 (6.0.622.26707), X64 RyuJIT
支持平台
- .NET Framework 4.6.1+
- .NET Standard 2.0+
- .NET 5.0+
如何使用
此库的使用非常简单,就像 .NET 标准的 System.Enum
一样。请看下面的例子:
//--- FastEnum
var values = FastEnum.GetValues<Fruits>();
var names = FastEnum.GetNames<Fruits>();
var name = FastEnum.GetName<Fruits>(Fruits.Apple);
var toString = Fruits.Apple.FastToString();
var defined = FastEnum.IsDefined<Fruits>(123);
var parse = FastEnum.Parse<Fruits>("Apple");
var tryParse = FastEnum.TryParse<Fruits>("Apple", out var value);
//--- .NET
var values = Enum.GetValues(typeof(Fruits)) as Fruits[];
var names = Enum.GetNames(typeof(Fruits));
var name = Enum.GetName(typeof(Fruits), Fruits.Apple);
var toString = Fruits.Apple.ToString();
var defined = Enum.IsDefined(typeof(Fruits), 123);
var parse = Enum.Parse<Fruits>("Apple");
var tryParse = Enum.TryParse<Fruits>("Apple", out var value);
如您所见,从 System.Enum
的替换非常简单。您永远不会感到困惑。
更多功能
有一些函数经常用于枚举,通过将它们一起包含,您可以更方便地使用它们。
1. 获取成对成员信息
有时你需要枚举的名称/值对。《Member
class Member<TEnum>
{
public TEnum Value { get; }
public string Name { get; }
public FieldInfo FieldInfo { get; }
// etc...
}
var member = Fruits.Apple.ToMember()!;
var (name, value) = member; // Supports deconstruction
2. 获取EnumMemberAttribute.Value
我经常看到开发者使用EnumMemberAttribute
作为字段名的别名。因此,FastEnum提供了一个API,可以从EnumMemberAttribute.Value
属性中快速获取值。
enum Company
{
[EnumMember(Value = "Apple, Inc.")]
Apple = 0,
}
var value = Company.Apple.GetEnumMemberValue(); // Apple, Inc.
3. 向字段添加多个标签注释
由于EnumMemberAttribute
指定了AllowMultiple = false
,因此不能将多个属性附加到同一个字段上。这很不方便,并且我个人不喜欢这样做,所以我经常使用自己的LabelAttribute
作为替代。由于FastEnum提供此功能,你可以方便地使用它如下。
enum Company
{
[Label("Apple, Inc.")]
[Label("AAPL", 1)]
Apple = 0,
}
var x1 = Company.Apple.GetLabel(); // Apple, Inc.
var x2 = Company.Apple.GetLabel(1); // AAPL
限制
1. 只提供泛型API
由于性能原因,FastEnum仅提供泛型版本的方法。《System.Enum》提供带System.Type
参数的过载,但由于装箱的出现,这很慢。如果您需要使用传递System.Type
类型的方法,请使用《System.Enum》版本。
2. 不能解析逗号分隔的字符串
System.Enum.Parse
可以解析如下字符串。我认为这是因为它是一个默默无闻的规范。
//--- Assuming there is an enum type like following...
[Flags]
enum Fruits
{
Apple = 1,
Lemon = 2,
Melon = 4,
Banana = 8,
}
//--- Passes comma-separated string
var value = Enum.Parse<Fruits>("Apple, Melon");
Console.WriteLine((int)value); // 5
它似乎是一个在执行标志处理时的有用功能,但如果尝试添加这种逗号分隔的分析,将会产生开销,因此取消此功能可以提高速度。我认为在大多数情况下没有问题,因为此功能很少使用(至少我在过去12年里从未使用过)。
为什么是快速的?
正如你所期望的,这是因为内部缓存的。它采用了静态类型缓存的方法,因此读取成本几乎为零。在此基础上,我使用避免分配的技术,并为特定的键内部创建专门的字典。
安装
从下载NuGet包开始。
dotnet add package FastEnum
PM> Install-Package FastEnum
许可证
此库根据MIT许可证提供。
作者
icamente Suzuki(又名@xin9le)自2012年7月起获得Microsoft MVP for Developer Technologies(C#)的日本软件开发人员。
产品 | 版本 兼容和附加的计算目标框架版本。 |
---|---|
.NET | net5.0 兼容。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 兼容。 |
.NET Framework | net461 兼容。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETFramework 4.6.1
- System.Runtime.CompilerServices.Unsafe (>= 4.5.0)
-
.NETStandard 2.0
- System.Runtime.CompilerServices.Unsafe (>= 4.5.0)
-
.NETStandard 2.1
- System.Runtime.CompilerServices.Unsafe (>= 4.5.0)
-
net5.0
- 无依赖。
-
net6.0
- 无依赖。
NuGet 包 (9)
显示依赖 FastEnum 的前 5 个 NuGet 包
包 | 下载 |
---|---|
Stringier
提供更愉悦的文本处理体验的文本扩展。 |
|
Defender
包描述 |
|
LShared.Frameworks
包描述 |
|
BimLab.PikTools.Updater.Sdk
PikTools Updater SDK |
|
LShared.Domain
包描述 |
GitHub 仓库 (2)
显示依赖 FastEnum 的最受欢迎的前 2 个 GitHub 仓库
仓库 | 星标 |
---|---|
TylerBrinkley/Enums.NET
Enums.NET 是一个高性能的类型安全 .NET 枚举实用程序库
|
|
NethermindEth/nethermind
面向以太坊节点运营商的强大执行客户端。
|
版本 | 下载 | 上次更新 |
---|---|---|
1.8.0 | 882,913 | 6/28/2022 |
1.7.0 | 99,507 | 11/9/2021 |
1.6.1 | 56,234 | 5/5/2021 |
1.6.0 | 128,589 | 11/14/2020 |
1.5.4 | 2,212 | 11/11/2020 |
1.5.3 | 14,289 | 4/18/2020 |
1.5.2 | 8,340 | 4/14/2020 |
1.5.1 | 8,012 | 1/12/2020 |
1.5.0 | 2,208 | 1/12/2020 |
1.4.1 | 3,393 | 10/30/2019 |
1.4.0 | 2,194 | 10/30/2019 |
1.3.1 | 2,363 | 10/15/2019 |
1.3.0 | 2,238 | 9/28/2019 |
1.2.0 | 2,215 | 9/16/2019 |
1.1.0 | 2,492 | 9/9/2019 |
1.0.0 | 2,383 | 9/6/2019 |