簡體   English   中英

屬性參數是按值傳遞的?

[英]Property parameter is pass by value?

我有以下活動課。 我有一個與Property方法set {userAccount = value;} ,它將創建userAccount對象的副本(深復制?),或者將復制userAccount對象引用的副本(淺復制嗎?),我是否需要在UserAccountInfo類中做一個方法來做值復制?

class EvEndGetUserAccount
    {
        private UserAccountInfo userAccount;

        /// <summary>
        /// An event class for getting user account
        /// </summary>
        /// <param name="account"></param>
        public EvEndGetUserAccount(UserAccountInfo account)
        {
            userAccount = account;
        }

        /// <summary>
        /// Get/Set userAccount
        /// </summary>
        public UserAccountInfo UserAccount
        {
            get { return userAccount; }
            set { userAccount = value; }
        }

        /// <summary>
        /// returns the content of this EvEndGetUserAccount event.
        /// </summary>
        /// <returns>string represent of the EvEndGetUserAccount object</returns>
        public override string ToString()
        {           
            return userAccount.ToString();
        }
    }

它不會復制UserAccountInfo。 這是引用類型,因此您的屬性被設置為對現有對象(而不是新對象)的引用。

如果您希望在運行setter時創建一個全新的對象,則需要在UserAccountInfo上實現一個Clone()方法,該方法可以進行深層復制。

它將進行淺表復制,換言之,它將僅復制參考。 如果要進行深拷貝(或克隆),則將IClonable接口添加到您的類中。 這將迫使您添加一個新的Clone方法,該方法實現確切的深度復制邏輯

首先,請注意一些術語:除非使用ref關鍵字,否則C#始終是按值傳遞的。 您要查找的區別是UserAccountInfo是值類型還是引用類型。

是的,您的類正在保留對UserAccountInfo對象的引用。 如果要更改此設置,則在將userAccount對象傳遞給setter和構造函數的同時,應該將其克隆()Clone()。 您還必須確保UserAccountInfo實現ICloneable。

但是,基於您提供的有限上下文,我的猜測是您保留一個引用,即保持原樣。

這是有關在C#中傳遞參數的良好鏈接: http : //www.yoda.arachsys.com/csharp/parameters.html

這取決於UserAccountInfo是哪種類型。 如果它是引用類型(通常是C# class ),則=運算符僅將引用復制到該對象的單個實例。

如果類型是值類型(例如,使用C# struct關鍵字聲明的類型或原始類型(例如int )聲明),則它將復制對象的值。 由於值類型通常是不可變的(意味着您無法修改值),因此您無法通過分析程序的行為(通過引用和值給出不可變數據類型的相同結果)來真正識別出這一點。

如果需要創建副本,可以考慮使用ICloneable接口。 您還可以使用MemberwiseClone方法克隆對象。 在.NET中,術語淺復制和深復制通常表示以下含義:

  • 淺拷貝 -創建一個新實例,並將原始實例的字段值復制到新實例(這意味着,如果克隆的對象引用了其他對象,則副本將引用相同的對象)

  • 深度復制 -克隆對象,還克隆對象引用的所有對象(依此類推...)。 這意味着將克隆整個對象參考樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM