【发布时间】:2013-01-25 11:17:39
【问题描述】:
这已经完全让我不知所措了,显然下面的代码是合法的,更令人惊讶的是从框架 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; } }
}
发生了什么事?这些年来,我看到这么多复制构造函数做多余的工作,在我遇到它之前我不会相信这项工作。它的使用是否有任何注意事项(除了明显的线程问题)?
【问题讨论】:
-
好吧,引用MSDN on the private modifier:
The private modifier makes a member of a class visible only within that **class**.注意它是怎么说的class,而不是instance... -
我看不出代码有什么问题,除了你可能改用
MemberwiseClone()。 -
如果您有兴趣,Scala 有一个修饰符 (
private[this]),可以让您使字段只能被同一个实例访问。 (这是我所知道的唯一一种语言。) -
附带说明的是,通常(松散地)使用
FromX(X x)形式的静态成员比“复制构造函数”更可取(仅基于我在 .NET 世界的经验) ,没有任何参考资料或任何东西)。 -
@GrantThomas:Objective-C 使用类似的东西,例如 NSArray 的
initWithArray。
标签: c#