使用C#索引器时的索引安全性?

时间:2009-12-02 02:29:41

标签: c#

我正在用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的情况,上面的代码甚至都不会编译。加上杰森在下面的实施非常棒。

4 个答案:

答案 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)

如果索引不一定必须是整数,则可以引入枚举,因此编译器将保证在代码中的任何位置都不会使用无效选项。