具有私有字段的类行为

时间:2009-12-02 07:48:47

标签: class properties field protection

我在我正在建造的图书馆中遇到了一些(至少对我而言)奇怪的行为;

我有这个方法:

public class Lib
{
 private string field = "field";

 public string Field
 {
  get
  {
   return field;
  }
 }

 public void Add(Lib lib)
 {
  string field = DoSomething(lib);
  Console.WriteLine(field);
 }

 protected string DoSomething(Lib lib)
 {
  return lib.field;
 }
}

所以,如果我从使用该库的程序中调用该方法:

Lib lib = new Lib();
Lib lib2 = new Lib();

lib.Add(lib2);

控制台给我"field"作为输出......现在,我不太明白为什么会这样。我将该字段声明为私有,那么为什么一个类可以访问其他类的私有属性,并且它没有给我一个关于访问限制的例外?!

根据我的理解,Lib无论如何都可以访问它自己的字段,但是当我给该方法另一个Lib实例时,第一个实例不应该访问秒''私有字段,因为......好吧,因为它是另一个实例而且是私有的!

3 个答案:

答案 0 :(得分:1)

这是设计使然,private访问修饰符限制对包含类型的访问。不是Type的实例。嵌套类型还可以访问包含Type的私有字段。

class MyType
{
    private string secret;

    public MyType(string secret) { this.secret = secret; }

    public void SomeMethod(MyType myType)
    {
        // Works because the private modifier pertains to the Type, not the instance
        Console.WriteLine(myType.secret); 
    }

    public class MyNestedType
    {
        public MyNestedType(MyType myType)
        {
            // Also works because the we are in a nested type of MyType
            Console.WriteLine(myType.secret); 
        }
    }
}

相关链接:Accessibility Levelsprivate

答案 1 :(得分:0)

私有对于类而言是私有的,而不是实例。

一开始以为我觉得这很奇怪,以为我在.NET中发现了一个“bug”。当我发布那个理论时,我把男孩放回原位......

答案 2 :(得分:0)

“控制台给我”字段“作为输出......现在,我不太明白为什么会这样。我将该字段声明为私有,那么为什么一个类可以访问其他类的私有属性并且它没有给我一个关于访问限制的例外?!“

但是另一个类没有直接访问字段;它只是访问Lib类实例的 public 方法,后者又访问私有成员field(由于类可以访问,所以允许它进行访问)它自己的私人成员。

这有点像说你不能走进我的房子拿走我的东西,因为这是私密的。但是,你可以非常自由地敲我的门,让我把你的东西给你,因为这是一种公开的方式。