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

本文关键字:类型 属性 定义 | 更新日期: 2023-09-27 18:37:11

命名属性和类型有问题。例:

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:你会怎么做?


将类型声明移到外面是有风险的,因为可能有几个类在语义上需要相同的名称来表示类型 ->冲突 ->某些类类型的奇怪名称或将类放在命名空间中的必要性。

重命名它..棘手。例如,重命名Shape类型,必须为绘制图形的几个类声明:FigureLineFigurePoint等。我可以称它们为ShapeLineShapePoint等等。或者我可以将类型 Shape 重命名为类似

public class FigureLine
{
    public enum LineShape {Straight, Bend, Whatever};
    public LineShape Shape {get; private set;}
}

但是现在如果我尝试使用它,那么它就会变得FigureLine.LineShape - 双线不好。

正在重命名属性...如何?

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

问题1:为什么出错?

您有两个成员,它们都在同一类中称为B。 (类型也是成员。除了方法重载之外,您不能这样做。

从 C# 规范的第 10.3 节:

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

下一个:

问题2:你会怎么做?

如果您希望该类是公开的,我可能会将其设置为顶级类。

1 - 通过将其移出来解决它。我建议遵循所有非私有类型都应位于其自己的源文件中的原则。

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

public enum LineShape {Straight, Bend, Whatever};
public class FigureLine
{
    public LineShape Shape {get; private set;}
}

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