繁体   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