スポンサーリンク

C#でListを値コピー(DeepCopy)する際のお勧め v2

.NET CoreC#

C#で自作したクラスのListを複製(値コピー/DeepCopy)する方法でネット検索すると、ToList()したり、newしたりする方法が出て来ますが、DeepCopy()メソッドを作るのが無難です。
MemberwiseClone()を使った DeepCopy の例 だと、データクラスに処理メソッドを持たせることでソースコードが煩雑になる問題がありますが、拡張メソッドにしたDeepCopy()メソッドだとデータクラスに処理を持たせる必要が無く、ソースコードがシンプルになります。
ソースコードはGitHubで公開しています。

BinaryFormatter()を使った場合に出力されていた警告

以前投稿した C#でListを値コピー(DeepCopy)する際のお勧め は警告が出力される為、今回、「チェックが厳しい現場だと使えない」という問題に対処しました。

ソースコード変更内容を解説

Utils/CopyHelper.cs

・DeepCopy共通部品。
・ジェネリックなのでどのデータ型にも対応できます。
・JsonSerializerOptionsにReferenceHandler.Preserveを指定することで、複雑で大きいデータクラスのコピーもできるようにしています。

Utils/CopyHelperTests.cs

・DeepCopy() を使った値コピーのテストプログラム。
・DeepCopy()元のインスタンスの値を変更しても、DeepCopy()先のインスタンスには影響が無いことを確認できます。

ソースコード構成

コンソールアプリ テンプレートプロジェクトに、ConsoleApp1Tests プロジェクトを追加しています。

コメント

タイトルとURLをコピーしました