考虑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#中有哪些规则阻止您访问嵌套类的私有属性?
(我意识到人们已经提供了替代here并且那很好。我感兴趣的是为什么你不能不经过修改就使用Java模式。
答案 0 :(得分:18)
在Java中,内部/嵌套类的私有成员可供包含类访问。在C#中他们不是。
答案 1 :(得分:3)
我不明白为什么应该允许编译。您正尝试从该类外部访问类的私有字段。但是,Java包含一个允许从外部类访问的嵌套类的特殊规则。
答案 2 :(得分:2)
C#中的可访问性级别如下:
C#中没有针对嵌套类的特殊情况,因此您无法从该类外部或从该类派生的任何类访问私有成员。
您可以在以下MSDN文章中找到更多信息:Accessibility Levels (C#)
答案 3 :(得分:0)