我可以在C#中复制ctor中访问私有成员

时间:2013-01-25 11:17:39

标签: c#

  

可能重复:
  Why and how does C# allow accessing private variables outside the class itself when it’s within the same containing class?

这完全超过了我的一些方面,显然下面的代码是合法的,更令人惊讶的是从框架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; } }
}

发生了什么事?多年来我见过这么多副本构造者做过多的工作,在我遇到它之前我不会相信这项工作。它的使用是否有任何警告(除了明显的线程问题)?

2 个答案:

答案 0 :(得分:3)

private不是对象级别,它是类级别,因此同一类的对象知道它们的私有方面,因此允许在同一类的其他对象上更改私有内容。

私人防止其他类型在他们不应该去的地方戳。

答案 1 :(得分:0)

C#中没有“复制构造函数”。只有构造函数。

在你的代码中你有toCopy参数,它是当前类Magic的一个实例。因为它是同一个类,您可以访问私有字段toCopy._anInttoCopy._aString(它是一个修饰符,使该字段显示同一个类的所有实例)。

当您使用构造函数时,可以设置新实例的字段_anInt_aString

readonly关键字只是说:“此字段只能在实例的构造函数中设置。