FastEnum 1.8.0
See the version list below for details.
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 is the fastest enum utilities for C#/.NET. It's much faster than .NET Core, and also faster than Enums.NET that is similar library. Provided methods are all achieved zero allocation and are designed easy to use like System.Enum
. This library is quite useful to significantly improve your performance because enum is really popular feature.
Performance
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
Support Platform
- .NET Framework 4.6.1+
- .NET Standard 2.0+
- .NET 5.0+
How to use
This library super easy to use like System.Enum
that is standard of .NET. Look below:
//--- 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);
As you can see, the replacement from System.Enum
is very easy. You never confuse.
More features
There are some functions that are often used for enum, and you can be used more conveniently by including them together.
1. Gets pairwised member information
Sometimes you want name / value pair of enum. Member<TEnum>
can be used under such cases. Of course supports deconstruction feature. FieldInfo
is also included, so please use it for reflection code.
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. Gets EnumMemberAttribute.Value
I often see the developer using EnumMemberAttribute
as an alias for field name. So FastEnum provides an API that the value can be quickly obtained from the EnumMemberAttribute.Value
property.
enum Company
{
[EnumMember(Value = "Apple, Inc.")]
Apple = 0,
}
var value = Company.Apple.GetEnumMemberValue(); // Apple, Inc.
3. Adds multiple label annotations to a field
Multiple attributes can’t be attached to the same field, since EnumMemberAttribute
is specified AllowMultiple = false
. It’s inconvenient and I don’t like it personally, so I often use my own LabelAttribute
as an alternative. You can use it conveniently as follows, because FastEnum provides this feature.
enum Company
{
[Label("Apple, Inc.")]
[Label("AAPL", 1)]
Apple = 0,
}
var x1 = Company.Apple.GetLabel(); // Apple, Inc.
var x2 = Company.Apple.GetLabel(1); // AAPL
Limitation
1. Provides only generics API
FastEnum provides only generics version method because of performance reason. System.Enum
provides System.Type
argument overload, but that’s too slow because of boxing occuration. If you need to use the method that passes System.Type
type, please use System.Enum
version.
2. Can’t parse comma-separated string
System.Enum.Parse
can parse like following string. I think that it isn’t well known because it is a specification that exists quietly.
//--- 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
It seems to be a useful function when performing flag processing, but if tries to add such a comma-separated analysis, the overhead will come out, so cutting this feature off makes speed up. I think that in most cases there is no problem, because this feature is rarely used (at least I have NEVER used for 12 years).
Why fast ?
As you might expect, it’s because cached internally. It takes the approach of Static Type Caching, so the reading cost is almost zero. Based on this, I use techniques for avoiding allocation, and create specialized dictionary for specific key internally.
Installation
Getting started from downloading NuGet package.
dotnet add package FastEnum
PM> Install-Package FastEnum
License
This library is provided under MIT License.
Author
Takaaki Suzuki (a.k.a @xin9le) is software developer in Japan who awarded Microsoft MVP for Developer Technologies (C#) since July 2012.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.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
- No dependencies.
-
net6.0
- No dependencies.
NuGet packages (10)
Showing the top 5 NuGet packages that depend on FastEnum:
Package | Downloads |
---|---|
Stringier
Text extensions for a more pleasant text processing experience. |
|
Defender
Package Description |
|
LShared.Frameworks
Package Description |
|
BimLab.PikTools.Updater.Sdk
PikTools Updater SDK |
|
chonhanh.common
Package Description |
GitHub repositories (3)
Showing the top 3 popular GitHub repositories that depend on FastEnum:
Repository | Stars |
---|---|
TylerBrinkley/Enums.NET
Enums.NET is a high-performance type-safe .NET enum utility library
|
|
NethermindEth/nethermind
A robust execution client for Ethereum node operators.
|
|
xin9le/FastEnum
The world fastest enum utilities for C#/.NET
|
Version | Downloads | Last updated |
---|---|---|
2.0.2 | 9,828 | 11/15/2024 |
2.0.1 | 16,050 | 9/29/2024 |
2.0.0 | 2,056 | 9/19/2024 |
1.8.0 | 1,054,286 | 6/28/2022 |
1.7.0 | 101,511 | 11/9/2021 |
1.6.1 | 59,118 | 5/5/2021 |
1.6.0 | 135,218 | 11/14/2020 |
1.5.4 | 2,404 | 11/11/2020 |
1.5.3 | 14,816 | 4/18/2020 |
1.5.2 | 8,608 | 4/14/2020 |
1.5.1 | 8,421 | 1/12/2020 |
1.5.0 | 2,394 | 1/12/2020 |
1.4.1 | 3,582 | 10/30/2019 |
1.4.0 | 2,379 | 10/30/2019 |
1.3.1 | 2,547 | 10/15/2019 |
1.3.0 | 2,429 | 9/28/2019 |
1.2.0 | 2,398 | 9/16/2019 |
1.1.0 | 2,673 | 9/9/2019 |
1.0.0 | 2,663 | 9/6/2019 |