第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

復(fù)制構(gòu)造函數(shù)與Clone()

復(fù)制構(gòu)造函數(shù)與Clone()

C#
慕斯709654 2019-12-21 11:33:45
在C#中,向類添加(深度)復(fù)制功能的首選方法是什么?是應(yīng)該實現(xiàn)副本構(gòu)造函數(shù),還是應(yīng)該派生ICloneable并實現(xiàn)該Clone()方法?
查看完整描述

3 回答

?
天涯盡頭無女友

TA貢獻(xiàn)1831條經(jīng)驗 獲得超9個贊

在C#中,向類添加(深度)復(fù)制功能的首選方法是什么?是應(yīng)該實現(xiàn)復(fù)制構(gòu)造函數(shù),還是應(yīng)該從ICloneable派生并實現(xiàn)Clone()方法?


ICloneable正如其他人提到的那樣,它的問題在于它沒有指定是深拷貝還是淺拷貝,這使得它實際上不可用,并且在實踐中很少使用。它也返回object,這很痛苦,因為它需要大量的轉(zhuǎn)換。(盡管您在問題中特別提到了類,但I(xiàn)Cloneable在structrequire box上實現(xiàn)。)


復(fù)制構(gòu)造者也遭受ICloneable的問題之一。復(fù)制構(gòu)造函數(shù)是在進(jìn)行深層復(fù)制還是淺層復(fù)制,這一點并不明顯。


Account clonedAccount = new Account(currentAccount); // Deep or shallow?

最好創(chuàng)建一個DeepClone()方法。這樣,意圖就很清楚了。


這就提出了一個問題,它應(yīng)該是靜態(tài)方法還是實例方法。


Account clonedAccount = currentAccount.DeepClone();  // instance method

要么


Account clonedAccount = Account.DeepClone(currentAccount); // static method

有時候,我稍微偏愛靜態(tài)版本,因為克隆似乎是對對象執(zhí)行的操作,而不是對象正在執(zhí)行的操作。無論哪種情況,在克隆屬于繼承層次結(jié)構(gòu)的對象時都將要處理一些問題,而如何解決這些問題最終可能會推動設(shè)計。


class CheckingAccount : Account

{

    CheckAuthorizationScheme checkAuthorizationScheme;


    public override Account DeepClone()

    {

        CheckingAccount clone = new CheckingAccount();

        DeepCloneFields(clone);

        return clone;

    }


    protected override void DeepCloneFields(Account clone)

    {

        base.DeepCloneFields(clone);


        ((CheckingAccount)clone).checkAuthorizationScheme = this.checkAuthorizationScheme.DeepClone();

    }

}


查看完整回答
反對 回復(fù) 2019-12-21
  • 3 回答
  • 0 關(guān)注
  • 507 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號