[英]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.