0

可能重复:
当 C# 在同一个包含类中时,为什么以及如何允许访问类本身之外的私有变量?

这已经完全让我失望了,显然下面的代码是合法的,更令人惊讶的是从框架 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; } }
}

这是怎么回事?这些年来,我看到这么多复制构造函数做多余的工作,在我遇到它之前我不会相信这项工作。它的使用是否有任何警告(除了明显的线程问题)?

4

2 回答 2

3

private 不是对象级别的,而是类级别的,所以同一个类的对象知道它们的私有方面,所以允许在同一个类的其他对象上更改私有的东西。

private 防止其他类型在他们不应该去的地方闲逛。

于 2013-01-25T11:21:33.190 回答
0

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

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

当您在构造函数中时,您可以设置新实例的_anIntfields _aString

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

于 2013-01-25T11:21:01.760 回答