シャローコピーとは何か?C#におけるディープコピーとの違いを徹底解説
C#でオブジェクトを複製する際、「シャローコピー(浅いコピー)」と「ディープコピー(深いコピー)」という2つの概念を理解することは非常に重要です。この記事では、それぞれの特徴と違いをコード例とともにわかりやすく解説します。
シャローコピー(浅いコピー)とは
シャローコピーとは、オブジェクトの「本体」だけをコピーし、その中に含まれる内部オブジェクトまではコピーしない方法です。
つまり、内部オブジェクトは元のオブジェクトとコピー先の両方で共有されることになります。
これがシャローコピー最大の問題点です。2つのオブジェクトは完全に独立していないため、片方のオブジェクトを変更すると、その変更がもう片方のオブジェクトにも反映されてしまいます。
ディープコピー(深いコピー)とは
一方、ディープコピーは完全に独立したコピーを作成する方法です。オブジェクトをコピーする際、内部構造も含めてオブジェクト全体を丸ごと複製します。
そのため、片方のオブジェクトを変更しても、その変更がもう片方のオブジェクトに影響を与えることはありません。
コード例で違いを見てみよう
以下のC#サンプルコードでは、シャローコピーとディープコピーの動作の違いを確認できます。
class Program{
static void Main(string[] args){
// シャローコピー
ShallowCopy obj = new ShallowCopy();
obj.a = 10;
ShallowCopy obj1 = new ShallowCopy();
obj1 = obj;
Console.WriteLine("{0} {1}", obj1.a, obj.a); // 10,10
obj1.a = 5;
Console.WriteLine("{0} {1}", obj1.a, obj.a); //5,5
// ディープコピー
DeepCopy d = new DeepCopy();
d.a = 10;
DeepCopy d1 = new DeepCopy();
d1.a = d.a;
Console.WriteLine("{0} {1}", d1.a, d.a); // 10,10
d1.a = 5;
Console.WriteLine("{0} {1}", d1.a, d.a); //5,10
Console.ReadLine();
}
}
class ShallowCopy{
public int a = 10;
}
class DeepCopy{
public int a = 10;
}
実行結果
10 10 5 5 10 10 5 10
実行結果のポイント
シャローコピーの場合:
obj1 = obj; によって参照が代入され、両者は同じオブジェクトを指すようになります。そのため obj1.a = 5; と変更すると、obj.a も「5」に変わってしまいます(出力:5 5)。
ディープコピーの場合:
d1.a = d.a; では値だけがコピーされ、2つのオブジェクトは独立しています。そのため d1.a = 5; としても、d.a は「10」のまま変わりません(出力:5 10)。
まとめ
シャローコピーは参照を共有するため軽量ですが、意図しない副作用が発生するリスクがあります。一方、ディープコピーはメモリ消費や処理コストが増えるものの、オブジェクト間の独立性が保たれるため安全です。用途に応じて適切なコピー方法を選択することが、バグの少ない堅牢なC#プログラムを書く鍵となります。
-
スピアフィッシングとは?その手口の特徴と身を守るための対策を徹底解説
フィッシング詐欺とは、攻撃者が正規の企業や組織になりすまし、巧妙に作られたメールやSMS、電話などで被害者に接触する詐欺行為の一種です。被害者は本物からの連絡だと信じ込んで指示に従ってしまい、結果として損害を被ります。この種のスパムは一度に大勢の無防備な人々へ送りつけられ、その一部が引っかかる仕組みになっています。 フィッシングは、漁師が海に網を投げ入れて不特定多数の魚を捕まえる様子に例えられます。 一方、スピアフィッシングは、特定の個人や組織を狙う標的型のフィッシング詐欺です。攻撃者はソーシャルエンジニアリングの手法を駆使し、正規の組織になりすまして、悪意のあるファイルや
-
スケアウェアとは?見分け方とWindows PCへの被害を防ぐ対策を徹底解説
「スケアウェア」とは、不要なソフトウェアをダウンロードさせたり購入させたりするために、ユーザーを恐怖に陥れる広告やメッセージの総称です。驚かせて不安を煽る手法を用いるソーシャルエンジニアリングの一種であり、最悪の場合、個人情報の盗難やクレジットカード詐欺の危険にさらされることもあります。さらに悪質なケースでは、サイバー犯罪者がハードディスク内のデータを人質に取り、身代金を支払うまで解放しないことさえあります。このような状況で使われる悪意あるプログラムをランサムウェアと呼びます。スケアウェアはランサムウェアを拡散する手段として使われることがありますが、両者の目的は異なります。スケアウェアは、有害