1

以下属性只是请求为 getter 和 setter 计算一次值

所以而不是:

public bool this[int x, int y]
{
    get
    {
        return this[x * this.width + y];
    }
    set
    {
        this[x * this.width + y] = value;
    }
}

如果我们可以这样做会更好:

public bool this[int x, int y]
{
    int index = x * this.width + y;

    get
    {
        return this[index];
    }
    set
    {
        this[index] = value;
    }
}

在这种情况下,这没什么大不了的,可以使用内联方法。但作为一个原则,有没有办法?

4

3 回答 3

5

和属性访问getset实际上被编译为两个独立的方法。如果您需要通用代码,则必须以与使用任何两种不同方法相同的方式进行 - 通过引入第三种方法,可能是静态方法。

private static CalculateIndex(int x, int width, int y)
{
    return x * width + y;
}

public bool this[int x, int y]
{
    get
    {
        return this[CalculateIndex(x, this.width, y)];
    }
    set
    }
        this[CalculateIndex(x, this.width, y)] = value;
    }
}

在这种情况下,您不能简单地设置一个变量,以便它对索引器的访问器是通用的,但是如果计算真的很苛刻,您可以使用某种缓存,在这种情况下,您将访问访问器中的缓存(只是就像index您示例中的变量一样)。这样做的问题是缓存确实是重量级的解决方案,您必须检查一个值是否被缓存,如果没有缓存,则计算它,并且在某些情况下还要从缓存中删除它(特别是为了避免内存泄漏)。

于 2012-12-04T16:30:38.797 回答
1

如果您不想进行两次计算,请添加辅助方法。

int GetOffset(int x, int y)
{
    return x + this.width * y;
}

public bool this[int x, int y]
{
    get
    {
        return this[GetOffset(x, y)];
    }
    set
    {
        this[GetOffset(x, y)] = value;
    }
}
于 2012-12-04T16:31:59.263 回答
-1

可能是这样的:

public bool this[int x, int y]
{    
    get
    {
        var index= x * this.width + y; //CALCULATE INDEX ON GET
        return this[index];
    }
    set
    {
        var index= x * this.width + y;//CALCULATE INDEX ON SET
        this[index] = value;
    }
}
于 2012-12-04T16:28:02.720 回答