我正在用C#编写一个Vector类,并认为索引器是一个很好的补充。我是否需要担心索引超出范围?
也许代码示例会更清晰:
class Vector3f
{
public Vector3f(float x, float y, float z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
public float X {get; set;}
public float Y {get; set;}
public float Z {get; set;}
public float this[int pos]
{
get
{
switch (pos)
{
case 0: return this.X; break;
case 1: return this.Y; break;
case 2: return this.Z; break;
}
}
set
{
switch (pos)
{
case 0: this.X = value; break;
case 1: this.Y = value; break;
case 2: this.Z = value; break;
}
}
}
}
我应该在default
语句中添加switch
个案例吗?该怎么办?
编辑:这是一个相当愚蠢的问题。如果没有default
的情况,上面的代码甚至都不会编译。加上杰森在下面的实施非常棒。
答案 0 :(得分:7)
这更加清晰,并且无需担心范围检查:
public enum Coordinate { X, Y, Z }
public float this[Coordinate coordinate] {
get {
switch(coordinate) {
case Coordinate.X: return this.X;
case Coordinate.Y: return this.Y;
case Coordinate.Z: return this.Z;
// convince the compiler that we covered everything
default: throw new ArgumentOutOfRangeException("coordinate");
}
}
set {
switch(coordinate) {
case Coordinate.X: this.X = value; break;
case Coordinate.Y: this.Y = value; break;
case Coordinate.Z: this.Z = value; break;
}
}
}
但请注意,坐标已经公开,那么索引器的重点是什么?
答案 1 :(得分:1)
我认为你应该像其他容器(如List)那样抛出ArgumentOutOfRangeException。 您可以从默认情况下抛出它。
答案 2 :(得分:0)
也许您应该使用枚举而不是int索引器,这样,您的代码将更加清晰,您不必担心outofrangeexceptions。事实上,你让人们很难看到代码的意图。
无论如何你需要索引器,为什么有人会使用vector [0]而不是vector.X?
答案 3 :(得分:0)
如果索引不一定必须是整数,则可以引入枚举,因此编译器将保证在代码中的任何位置都不会使用无效选项。