Baksteen.Extensions.DeepCopy
1.0.2
See the version list below for details.
dotnet add package Baksteen.Extensions.DeepCopy --version 1.0.2
NuGet\Install-Package Baksteen.Extensions.DeepCopy -Version 1.0.2
<PackageReference Include="Baksteen.Extensions.DeepCopy" Version="1.0.2" />
paket add Baksteen.Extensions.DeepCopy --version 1.0.2
#r "nuget: Baksteen.Extensions.DeepCopy, 1.0.2"
// Install Baksteen.Extensions.DeepCopy as a Cake Addin #addin nuget:?package=Baksteen.Extensions.DeepCopy&version=1.0.2 // Install Baksteen.Extensions.DeepCopy as a Cake Tool #tool nuget:?package=Baksteen.Extensions.DeepCopy&version=1.0.2
C# extension method for fast object cloning.
This is a speed-optimized fork of Alexey Burtsev's deep copier. Depending on your usecase, this will be 2x - 3x faster than the original. It also fixes some bugs which are present in the original code. Compared to the classic binary serialization/deserialization deep clone technique, this version is about seven times faster (the more arrays your objects contain, the bigger the speedup factor).
The speedup is achieved via the following techniques:
- object reflection results are cached
- don't deep copy primitives or immutable structs & classes (e.g. enum and string)
- to improve locality of reference, process the 'fast' dimensions or multidimensional arrays in the inner loops
- use a compiled lamba expression to call MemberwiseClone
How to use:
Use NuGet package manager to add the package Baksteen.Extensions.DeepCopy to your project. Then:
using Baksteen.Extensions.DeepCopy;
...
var myobject = new SomeClass();
...
var myclone = myobject.DeepCopy()!; // creates a new deep copy of the original object
Note: the exclamation mark (null-forgiving operator) is only required if you enabled nullable reference types in your project
Contributors:
- Alexey Burtsev (original deep copy code)
- Wouter Groeneveld (unit tests & XElement copy)
- Gitkarst (treat enum as immutable)
- Jean-Paul Mikkers (speed optimization)
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | 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 is compatible. 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. |
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Baksteen.Extensions.DeepCopy:
Package | Downloads |
---|---|
ScapeCore.Core.Engine
Main engine types from ScapeCore repository. |
|
ScapeCore.Core.Serialization
Serializer used in ScapeCore. It uses protocol buffers with optional gZip compression. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Speed up cloning of objects containing nullable primitives, added support for dotnet 7.