这完全超过了我的一些方面,显然下面的代码是合法的,更令人惊讶的是从框架2开始是合法的......
public class Magic
{
private readonly int _anInt;
private readonly string _aString;
public Magic(int anInt, string aString)
{
_anInt = anInt;
_aString = aString;
}
public Magic(Magic toCopy)
{
_anInt = toCopy._anInt; // Legal!
_aString = toCopy._aString; // Legal!
}
public void DoesntWorkMagic(Magic toCopy)
{
_anInt = toCopy._anInt; // edit: Will work if not readonly.
_aString = toCopy._aString;
}
public int AnInt { get { return _anInt; } }
public string AString { get { return _aString; } }
}
发生了什么事?多年来我见过这么多副本构造者做过多的工作,在我遇到它之前我不会相信这项工作。它的使用是否有任何警告(除了明显的线程问题)?
答案 0 :(得分:3)
private不是对象级别,它是类级别,因此同一类的对象知道它们的私有方面,因此允许在同一类的其他对象上更改私有内容。
私人防止其他类型在他们不应该去的地方戳。
答案 1 :(得分:0)
C#中没有“复制构造函数”。只有构造函数。
在你的代码中你有toCopy参数,它是当前类Magic的一个实例。因为它是同一个类,您可以访问私有字段toCopy._anInt
和toCopy._aString
(它是一个修饰符,使该字段显示同一个类的所有实例)。
当您使用构造函数时,可以设置新实例的字段_anInt
,_aString
。
readonly
关键字只是说:“此字段只能在实例的构造函数中设置。