【问题标题】:Why is calling a protected or private CSharp method / variable possible? [duplicate]为什么可以调用受保护的或私有的 CSharp 方法/变量? [复制]
【发布时间】:2011-12-05 04:19:06
【问题描述】:

可能重复:
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();
    }
}

在我的构造函数中,我调用了otherObjectprivateprotected 东西。 为什么会这样?我一直认为 private 是真正的私有(意味着只有对象可以调用该方法/变量)或受保护(只能通过重载访问)。

为什么以及何时必须使用这样的功能?

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

【问题讨论】:

标签: c# .net


【解决方案1】:

回答你的问题:

例如,您可以在克隆方法中使用它。您需要对可能以只读方式公开的成员的写入权限。喜欢

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】:

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

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

    【讨论】:

      【解决方案3】:

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

      访问权限由您正在访问的 express 的 type 应用,而不是您正在访问的对象的 identity

      至于什么时候有用 - 比较相同类型的两个对象、克隆等......当您“信任”同一类中的代码时,不必公开所有细节是很方便的。

      【讨论】:

        【解决方案4】:

        来自MSDN(C# 参考)

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-07-19
              • 1970-01-01
              • 2014-11-10
              • 2012-09-28
              • 2019-07-24
              • 1970-01-01
              • 2010-10-06
              • 2011-01-31
              相关资源
              最近更新 更多