在类中定义该类型的类型和属性
本文关键字:类型 属性 定义 | 更新日期: 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
类型,必须为绘制图形的几个类声明:FigureLine
、FigurePoint
等。我可以称它们为ShapeLine
,ShapePoint
等等。或者我可以将类型 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 形状)。