11

考虑 Bloch 的 Builder 模式的逐字副本(对 C# 的语法进行了更改):

public class NutritionFacts
{
  public int ServingSize { get; private set; }
  public int Servings { get; private set; }
  public int Calories { get; private set; }
  ...
  public class Builder
  {
    private int ServingSize { get; set; }
    private int Servings { get; set; }
    private int Calories { get; set; }

    public Builder(int servingSize, int servings)
    {
      ServingSize = servingSize;
      Servings = servings;
    }

    public Builder Calories(int calories)
    { Calories = calories; return this; }

    public NutritionFacts Build()
    {
      return new NutritionFacts(this);
    }
  }

  private NuitritionFacts(Builder builder)
  {
    ServingSize = builder.ServingSize;
    Servings = builder.Servings;
    Calories = builder.Calories;
  }
}

如果您尝试运行它,C# 编译器将抱怨它没有访问 Builder 私有属性的权限。但是,在 Java 中,您可以这样做。C# 中有什么不同的规则阻止您访问嵌套类的私有属性?

(我意识到人们在这里提供了替代方案,这很好。我感兴趣的是为什么你不能在不修改的情况下使用 Java 模式)。

4

4 回答 4

19

在 Java 中,内部/嵌套类的私有成员可以被包含类访问。在 C# 中它们不是。

于 2009-07-03T18:23:47.077 回答
3

我不明白为什么应该允许编译。您正在尝试从该类外部访问该类的私有字段。然而,Java 包含一个允许从外部类访问的嵌套类的特殊规则。

于 2009-07-03T18:24:30.117 回答
3

C# 中的可访问性级别如下:

  • public:访问不受限制。
  • protected:访问仅限于包含类或从包含类派生的类型。
  • internal:访问仅限于当前程序集。
  • protected internal:访问仅限于当前程序集或从包含类派生的类型。
  • private:访问仅限于包含类型。

对于嵌套类,C# 中没有特殊情况,因此您无法从该类外部或从该类派生的任何类访问私有成员。

您可以在以下 MSDN 文章中找到更多信息:Accessibility Levels (C#)

于 2009-07-03T18:32:35.490 回答
0

Gilad Bracha认为,允许外部类访问嵌套类的私有内容打破了“面向对象语言类型系统的包含规则”。

于 2009-07-03T18:38:52.610 回答