在类中定义该类型的类型和属性

时间:2013-10-29 10:19:01

标签: c# class types properties naming

命名属性和类型时出现问题。例如:

public class A
{
    public class B { ... }
    public B B; // << error
}

问题1:为什么会出错?

我可以像这样解决它

public class A
{
    public B B;
}
public class B { ... } // move it outside

或者像这样

public class A
{
    public class B { ... }
    public B BB; // rename property
}

甚至

public class A
{
    public class BB { ... } // rename type
    public BB B;
}

问题2:你会怎么做?


外部移动类型声明是有风险的,因为类型可能有几个类在语义上需要相同名称 - &gt;冲突 - &gt;某些类类型的奇怪名称或将类放入名称空间内的必要性。

重命名..棘手。例如,重命名Shape类型,必须为几个绘制数字的类声明:FigureLineFigurePoint等。我可以称它们为ShapeLine,{{1} } 等等。或者我可以将类型ShapePoint重命名为

Shape

但现在如果我尝试使用它,那就变成public class FigureLine { public enum LineShape {Straight, Bend, Whatever}; public LineShape Shape {get; private set;} } - 双就不好了。

重命名属性......怎么样?

2 个答案:

答案 0 :(得分:3)

  

问题1:为什么会出错?

你有两个成员在同一个班级中都叫B。 (类型也是成员。)除了方法重载之外,你不能这样做。

来自C#规范的第10.3节:

  
      
  • 常量,字段,属性,事件或类型的名称必须与同一类中声明的所有其他成员的名称不同。
  •   

下一步:

  

问题2:你会怎么做?

如果你希望课程公开,我可能会把它变成顶级课程。

答案 1 :(得分:2)

1 - 将它移到外面解决它。我建议遵循以下原则:所有非私有类型都应该在他们自己的源文件中。

2 - 我不太清楚这里的问题是什么,即使将枚举移动到自己的文件中,我也会坚持你的名字:

public enum LineShape {Straight, Bend, Whatever};

public class FigureLine
{
    public LineShape Shape {get; private set;}
}

LineShape是一个比Shape更好的名称,因为它更好地描述了枚举的用途(定义线条样式,而不是2D或3D形状)。