0

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

我有这个方法:

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"作为输出......现在,我不太明白为什么会发生这种情况。我将该字段声明为私有,那么为什么一个类可以访问其他类的私有属性并且它没有给我一个关于访问限制的异常?!

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

4

3 回答 3

1

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

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); 
        }
    }
}

相关链接:可访问性级别私人

于 2009-12-02T08:02:15.507 回答
0

private 表示类私有,而不是实例私有。

起初我认为这很奇怪,并认为我在 .NET 中发现了一个“错误”。当我发布那个理论时,我被放回原处了……

于 2009-12-02T08:09:35.120 回答
0

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

但是另一个类没有直接访问字段;它只是访问类实例的公共Lib方法,然后访问私有成员field(允许这样做,因为类可以访问其自己的私有成员。

这有点像说你不能走进我的房子拿走我的东西,因为那是私人的。但是,你可以很随意地敲我的门,让我把我的东西给你,因为这是一种公开的方式。

于 2009-12-02T08:10:28.750 回答