为什么可以调用受保护的或私有的CSharp方法/变量?

时间:2011-10-11 10:10:57

标签: c# .net

  

可能重复:
  Why are private fields private to the type, not the instance?

考虑以下课程:

public class Test
{
    protected string name;
    private DateTime dateTime;

    public Test(string name)
    {
        this.name = name;
        this.dateTime = DateTime.Now;
    }

    public Test(Test otherObject)
    {
        this.name = otherObject.name;
        this.dateTime = otherObject.GetDateTime();
    }

    private DateTime GetDateTime()
    {
        return dateTime;
    }

    public override string ToString()
    {
        return name + ":" + dateTime.Ticks.ToString();
    }
}

在我的构造函数中,我正在调用otherObject私有受保护的内容。 为什么这可能?我一直认为私有是私有的(暗示只有对象可以调用该方法/变量)或受保护(只能通过重载访问)。

为什么以及何时需要使用此类功能?

我缺少一些OO逻辑/原则吗?

6 个答案:

答案 0 :(得分:5)

来自MSDN(C#参考)

  

private关键字是成员访问修饰符。私人访问是   最低许可访问级别。私人会员仅可访问   在类的主体或声明它们的结构体内。

答案 1 :(得分:3)

回答你的问题:

您可以在克隆方法中使用它。您需要对可能以只读方式公开的成员的写访问权限。像

class MyClass : ICloneable
{
    public object Clone()
    {
        var clone = (MyClass)MemberwiseClone();
        clone.Value = this.Value; // without the way private works, this would not be possible
        return clone;
    }

    public int Value{ get; private set;}
}

答案 2 :(得分:2)

这完全符合C#规范。 (这也是Java如何确定可访问性。)

访问权限由您正在访问的表达式的类型应用,而不是您正在访问的对象的身份

至于它何时有用 - 比较两个相同类型的对象,克隆等......当你在同一个类中“信任”代码时,不必公开公开所有细节。

答案 3 :(得分:2)

对于其他类而言,它不是对象实例的私有,因此,因为您在同一个类中,所以可以访问它的私有方法。

您可以将其用于对象克隆,例如

答案 4 :(得分:1)

访问修饰符由类决定,而不是由对象决定。如果要从其他类的方法访问testObject,那么同样的事情是不可能的。

使用它的简单示例是Clone()方法,您必须访问其他对象私有部分才能创建副本。

答案 5 :(得分:1)

私有意味着它只能由同一类中的代码访问。这就是这种情况。你有另一个实例,但它是同一个类。