【问题标题】:Class-behaviour with private fields具有私有字段的类行为
【发布时间】:2009-12-02 07:48:47
【问题描述】:

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

我有这个方法:

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 的另一个实例时,第一个实例应该不可能访问秒的私有字段,因为...好吧,因为它是另一个实例并且是私有的!

【问题讨论】:

  • 不应该 public string Fieldprivate string Field 吗?
  • 不,field 是私有的,Field 是可用于从公共角度访问field 的访问器。当然,在示例中它没有多大意义,因为它只是返回 field,但您可以在此处添加更多逻辑以增强您在访问 Field 时收到的输出(例如重新格式化等)

标签: class properties field protection


【解决方案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); 
        }
    }
}

相关链接:Accessibility Levelsprivate

【讨论】:

  • 你如何将一个字段声明为secret 到一个类的实例?
  • 据我所知,没有访问修饰符可以做到这一点。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    但其他类没有直接访问字段;它只是访问Lib 类实例的public 方法,该方法又访问私有成员field(允许这样做,因为一个类可以访问它自己的私有成员.

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

    【讨论】:

    • 方法是从Lib的参数化实例中访问私有字段:“field”。
    • 好的,我刚刚注意到“return lib.field;”。我认为在任何情况下我都不应该能够访问私有类型的实例,但你所说的似乎是一旦在类定义中使用实例(例如在函数中),那么它的私有字段可以是访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2011-10-22
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2011-09-26
    • 2022-01-04
    相关资源
    最近更新 更多