FastEnum 1.8.0

dotnet add package FastEnum --version 1.8.0                
NuGet\Install-Package FastEnum -Version 1.8.0                
此命令旨在用于 Visual Studio 的包管理器控制台,因为它使用了 NuGet 模块版本的 Install-Package
<PackageReference Include="FastEnum" Version="1.8.0" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件以引用软件包。
paket add FastEnum --version 1.8.0                
#r "nuget: FastEnum, 1.8.0"                
#r 指令可以在 F# Interactive 和 Polyglot Notebooks 中使用。将其复制到交互式工具或脚本的源代码中以引用软件包。
// 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 一样易于使用。这个库非常有用,可以显著提高您的工作效率,因为枚举是一个非常受欢迎的特性。

Releases

性能

image

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`在这种情况下可以使用。当然,支持解构功能。《FieldInfo`也包含在内,因此请使用它进行反射代码。

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 已计算。
兼容目标框架
包含的目标框架(在包中)
关于目标框架.NET Standard的更多信息。

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