じゃんぬのどっとてきすと

雑記とネタと時々プログラミング

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  982  : 記事  4  : コメント  16193  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

少し前に女のコが生まれました。家事と育児と仕事にと奮起しています。めちゃくちゃかわいいです。あと Blog の更新は全然してませんが、Twitter とかでアホなこと呟いています。見つけることができたら、ぜひフォローしてあげてください。けっこう喜びます。

Sponsored Link1

Sponsored Link2

Archive

書庫

インスタンスの中身をコピーするには、大きく分けて 2 通りの方法があります。
ひとつが、インスタンス内のメンバを手動でコピーする方法です。

この方法は、Clone、Copy のような名前のメソッドを定義し、
その中で新規のインスタンスを生成し、既存のインスタンスからコピーすれば良いのです。
(C# だと読めない (読まない) 方が多いらしいので、VB で書いてみました)

VB.NET

Option Strict On

' テスト用のデータクラス
Public Class WankumaMember

    ' 面倒なのでフィールド メンバにしちゃってます
    Public MemberCode As Integer
    Public MemberName As String
    Public Age        As Integer

    ' 同じクラスのインスタンスを返すクローン コピーメソッド
    Public Function CloneCopy() As WankumaMember
        ' 同クラスの新しいインスタンスを生成する
        Dim hClone As New WankumaMember()

        ' 新しい方のインスタンスに、現インスタンスのメンバの内容をひとつひとつ丁寧に渡す
        hClone.MemberCode = Me.MemberCode
        hClone.MemberName = Me.MemberName
        hClone.Age        = Me.Age

        ' コピーされた方のインスタンスを返す
        Return hClone
    End Function

End Class

この方法の欠点はメンバに変化があったら、当然変更しなくてはいけないという点です。
逆に予期せぬクローン コピーは発生しないというのはメリットにもなるでしょう。

もうひとつが、System.Object.MemberwiseClone メソッドを使用する方法です。
こちらは、上記のように、ひとつひとつメンバをコピーする必要はありません。

通常、MemberwiseClone メソッドは、System.ICloneable インターフェイスを実装して使われます。
実装することになる System.ICloneable.Clone メソッドの戻り値は System.Object 型です。
戻り値が System.Object 型ということは、利用する側で型変換しなくてはなりません。

これでは面倒ですので、System.ICloneable.Clone メソッドは Private のアクセス修飾子とし、
これをラップして、戻り値を同じクラスの型にする ラッパーメソッドを書きます。

VB.NET

Option Strict On

' テスト用のデータクラス (System.ICloneable インターフェイスを実装)
Public Class WankumaMember : Implements System.ICloneable

    ' 面倒なのでフィールド メンバにしちゃってます
    Public MemberCode As Integer
    Public MemberName As String
    Public Age        As Integer

    ' System.ICloneable.Clone メソッド (非公開メンバとする)
    Private Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone()
    End Function

    ' 同じクラスのインスタンスを返すクローン コピーメソッド (上のメソッドを型変換して返す)
    Public Function CloneCopy() As WankumaMember
        Return DirectCast(Me.Clone(), WankumaMember)
    End Function

End Class

System.ICloneable.Clone メソッドを MemberwiseClone メソッドで実装する場合、
注意しなくてはならないことがあります。

今回の例では、値型のメンバしか含まれないので問題になりませんが、
参照型のメンバを含む場合は、参照先のインスタンスそのものがコピーされるのではなく、
参照先を示すアドレス、言わばポインタ (参照) がコピーされるだけです。

そのため、複製元、複製先のどちらかで参照型のメンバの実体に変更を加えれば、
もう一方からも変更されることになります。(というよりは、同じものを見ているから当たり前ですね)

これについての詳細は、次回の シャローコピー と ディープコピー で、ご紹介します。

それにしても、シャローコピー、簡易コピー、簡易複製、Shallow Copy、浅いコピー、
ディープコピー、Deep Copy、深いコピー、深い複製... 色んな名称がありすぎです。

投稿日時 : 2006年4月6日 10:04

コメント

# re: ICloneable と MemberwiseClone 2006/04/06 12:02 じゃんぬ
これを見てもらった方が……はやーい!

オブジェクトのコピーってどうやるんですか?
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27051&forum=7

# EUfRCqmuUfuhwQIaz 2014/08/07 0:13 http://crorkz.com/
vesGUu Thanks-a-mundo for the blog post.

# gLnnyyXNyHFMVtDiLCG 2014/09/03 9:29 http://ecommerce-investments.com/boat-safety-acces
I have learn a few good stuff here. Certainly value bookmarking for revisiting. I wonder how a lot attempt you place to make one of these wonderful informative web site.

# loccFVTxNieSF 2014/09/03 10:48 http://ecommerce-for-business.com/marine-safety-eq
Excellent site. A lot of useful information here. I'm sending it to some friends ans also sharing in delicious. And of course, thanks for your effort!

# YpOiIlAWZNfYhMcAMb 2014/09/09 20:16 http://www.arrasproperties.com/
Hi there, You've done an incredible job. I'll certainly digg it and personally recommend to my friends. I'm sure they will be benefited from this site.

# afzmjeqivko xoctosnch qwpzrwgu
2014/12/27 20:35 AlbertKess
http://www.wreckrc.com/fdhgtrfhyt/20141223192855844.htmlhttp://tisaheel.com/fdhgtrfhyt/20141223192855309.html http://www.halledwardspa.com/degregtr/20141223174653007.htmlhttp://www.charltonpress.com/degregtr/20141223174653903.html http://www.saratogainvestmentcorp.com/fdgbrthyt/20141223193346025.htmlhttp://www.ceritar.com/fdgbrthyt/20141223193346151.html http://www.wreckrc.com/warerfewf/20141223155630628.htmlhttp://www.charltonpress.com/warerfewf/20141223155630267.html file_links[C:\112\12.0021.txt,2,NP]
http://www.dwightcountryclub.com/fdhgtrfhyt/20141223192855643.htmlhttp://www.burlingtoneye.com/fdhgtrfhyt/20141223192855707.html http://flyinterguide.net/degregtr/20141223174652735.htmlhttp://www.burlingtoneye.com/degregtr/20141223174653826.html http://tisaheel.com/fdgbrthyt/20141223193346796.htmlhttp://flyinterguide.net/fdgbrthyt/20141223193346783.html http://www.dwightcountryclub.com/warerfewf/20141223155630666.htmlhttp://www.burlingtoneye.com/warerfewf/20141223155630896.html file_links[C:\112\12024.txt,2,NP]
Bordo T shirts Guys Cornell Splitting up official documented, Wenzhou boot market place http://www.saratogainvestmentcorp.com/fdhgtrfhyt/20141223192855615.htmlto open globally unpopular, will be pressured by just push variations in every of the to foreign countries niche, innumerable otherhttp://www.ceritar.com/fdhgtrfhyt/20141223192855770.html is often a foreseen syndication regarding places, Wenzhou athletic shoes of your respective roadwayshttp://www.halledwardspa.com/degregtr/20141223174653691.html. The corporation offers developer shoes and boots for every girl or boyhttp://www.wreckrc.com/degregtr/20141223174653856.html. Grownup women on a regular basis attain a new bunion as a consequence of types of instructors some individuals http://flyinterguide.net/fdgbrthyt/20141223193346430.htmlend up being puting on. The optimal snowblowers may possibly expense a lot of us dollars. And also, Nike The http://tisaheel.com/fdgbrthyt/20141223193346379.htmlcontact lens high quality Hyperdunk Brand-new Very little variants within the shoes or boots in the bottom parthttp://www.saratogainvestmentcorp.com/warerfewf/20141223155630130.html for the insole to acquire coaches organized for the despression symptomshttp://www.burlingtoneye.com/warerfewf/20141223155633427.html.

http://www.charltonpress.com/degregtr/20141223170904195.html
http://www.wreckrc.com/degregtr/20141223165237480.html
http://www.saratogainvestmentcorp.com/degregtr/20141223172208654.html
http://www.wreckrc.com/degregtr/20141223165459488.html
http://tisaheel.com/degregtr/20141223171213858.html
http://flyinterguide.net/fdhgtrfhyt/20141223195847756.html
http://www.ceritar.com/fdhgtrfhyt/20141223192140064.html
http://www.charltonpress.com/fdhgtrfhyt/20141223191114772.html
http://www.halledwardspa.com/fdhgtrfhyt/20141223190727662.html
http://tisaheel.com/fdhgtrfhyt/20141223192834678.html
http://tisaheel.com/fdgbrthyt/20141223183648625.html
http://www.jpseafoodcafe.com/fdgbrthyt/20141223190603344.html
http://www.saratogainvestmentcorp.com/fdgbrthyt/20141223182140832.html
http://tisaheel.com/fdgbrthyt/20141223182728966.html
http://www.burlingtoneye.com/fdgbrthyt/20141223185824762.html
http://www.ucpholdings.com/warerfewf/20141223155003735.html
http://www.charltonpress.com/warerfewf/20141223160713117.html
http://www.ucpholdings.com/warerfewf/20141223160441237.html
http://www.ceritar.com/warerfewf/20141223161240596.html
http://www.ucpholdings.com/warerfewf/20141223154210064.html


Post Feedback

タイトル
名前
Url:
コメント: