Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';t布洛赫';C语言中的s Builder模式工作#_C#_Java_.net_Design Patterns_Builder - Fatal编程技术网

C# 为什么';t布洛赫';C语言中的s Builder模式工作#

C# 为什么';t布洛赫';C语言中的s Builder模式工作#,c#,java,.net,design-patterns,builder,C#,Java,.net,Design Patterns,Builder,考虑Bloch的Builder模式的逐字复制(对C#的语法进行了更改): 如果您尝试运行此命令,C#编译器将抱怨它没有访问生成器私有属性的权限。但是,在Java中,您可以这样做。C#中有什么不同的规则阻止您访问嵌套类的私有属性 (我意识到人们已经给出了替代方案,这很好。我感兴趣的是,为什么不经过修改就不能使用Java模式)。在Java中,包含类可以访问内部/嵌套类的私有成员。在C语言中,它们不是。我不明白为什么应该允许编译它。您正试图从该类外部访问该类的私有字段。但是,Java包含一个针对嵌套类

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

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


(我意识到人们已经给出了替代方案,这很好。我感兴趣的是,为什么不经过修改就不能使用Java模式)。

在Java中,包含类可以访问内部/嵌套类的私有成员。在C语言中,它们不是。我不明白为什么应该允许编译它。您正试图从该类外部访问该类的私有字段。但是,Java包含一个针对嵌套类的特殊规则,允许从外部类进行访问。

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

  • 公共:访问不受限制
  • 受保护:访问仅限于包含类或从包含类派生的类型
  • 内部:访问权限仅限于当前程序集
  • 受保护的内部:访问仅限于从包含类派生的当前程序集或类型
  • 私有:访问仅限于包含类型
对于嵌套类,C#中没有特殊情况,因此您无法从该类外部或从该类派生的任何类访问私有成员


您可以在下面的MSDN文章中找到更多信息:

Gilad Bracha允许外部类访问嵌套类的私有部分打破了“OO语言类型系统的包容规则”。

我的理解是,C#嵌套类有一种特殊情况。它们可以访问封闭类型的私有项。编译器通过生成具有适当权限的合成访问器来实现这一点。对不起,让一条旧线复活了…@乔纳森:是的,没错。这与JVM并不真正了解嵌套类这一事实有关,因此合成方法对于获得所需的行为是必要的。我的印象是,问题是关于Java语言,而不是JVM。我只是想提供更多的信息,以防将来有人偶然发现。@Jonathan我来自未来!非常感谢。嗨,我问了这个问题。得到了一些很好的答案。我们开始
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;
  }
}