【问题标题】:Why are my privates accessible?为什么我的私人信息可以访问?
【发布时间】:2011-07-11 19:51:33
【问题描述】:

我有以下代码:

public class PersonInitializer
{
    private Person _person;

    public static Person LoadFromFile(string path)
    {
        PersonInitializer x = new PersonInitializer();

        Person p = x._person; //Why am I accessible?

        return x.LoadFromFile(); //Sure.

    }

    public Person LoadFromFile(string path)
    {

    }
}

为什么 _person 可以从 x 访问,即使它是 private?我能做些什么来“保护”_person?

【问题讨论】:

  • 如果你像我一样不成熟和幼稚,非常有趣的问题标题。
  • 彼得,我编辑了这个问题,所以没有更多有趣的笑话了;)
  • @Peter:我觉得会很有趣!这是故意的,很高兴你喜欢它。 :)
  • 检查 MissingTrousers 编译器警告...

标签: c# .net oop


【解决方案1】:

它是可访问的,因为你是它定义的类!

访问修饰符适用于类,而不是类的实例。这意味着,A 类的一个实例可以访问 A 类的另一个实例的所有私有成员。

我假设,你同意我的观点,这是可以的:

var p = this._person;

但是这个呢:

public void DoSomething(PersonInitializer personInitializer)
{
    var p = personInitializer._person;
}

根据您的假设,此代码是否有效取决于输入。
示例:

DoSomething(this); // ok
DoSomething(other); // not ok

这毫无意义:-)

【讨论】:

  • 基于类实例的范围确实有意义,Effel 做到了。它只是输给了导致基于类的 C# 作用域的 C++ 思维方式。
【解决方案2】:

这是因为您正在从成员函数访问它。 如果您想阻止对该特定函数的访问,您可能需要将该静态函数移到一个新类中。

【讨论】:

  • 这就是我最终要做的。
【解决方案3】:

私有变量/引用只能在定义它们的类中访问。
因为在您的情况下,引用 Person _person; 是在您访问它的同一类中定义的,因此可以访问它。

【讨论】:

    【解决方案4】:

    来自documentation

    私人会员只能访问 在类的主体内或 声明它们的结构。

    由于LoadFromFile 位于声明_person 的类的主体中,因此它可以访问它。你对此无能为力,因为

    私人访问最少 许可访问级别。

    【讨论】:

      【解决方案5】:

      在 C#(和 Jave、C++)中,字段的范围是基于类的,因此类的所有实例可以访问同一类的其他实例的私有成员。

      在像Eiffel(和Smalltalk)这样的语言中,字段的范围基于实例,因此私有字段只能由同一实例访问 . Eiffel 方法可能更好,但 C++ 赢得了大多数程序员的心,因此很少有人质疑“基于类的作用域”

      【讨论】:

      • Ian,你不能把东西弄得太私密以至于连同一个班级都不能使用它,对不起,可见性访问器 secret 还没有发明,所以你可以使用 private 这意味着在其他类中您无法看到和使用私有成员。
      猜你喜欢
      • 2016-10-26
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多